読み込み中

トップページの白馬の表現について

白馬のスプライト、足運びのリズム、WebGL の残像。トップページの動きを、再生できるデモとコードで説明します。

トップページでは、白馬がアーチの奥から現れ、こちらに向かって駆けてきます。滑らかにつながる映像ではなく、姿勢が一枚ずつ切り替わり、その後ろに残像が残る表現です。

この記事では、足運びを固定位置で再生できるように切り出しました。素材の構成から、時間の刻み方、トップページでの描画までを紹介します。

白馬の足運び

「タカタッ、タカタッ」と駆ける感じは、姿勢の変化と、それぞれを表示する時間の組み合わせで作っています。下のデモでは、トップページで使っている素材の9〜12コマ目を、同じ位置・同じ大きさで繰り返します。

固定位置で足運びを繰り返すデモ。
再生には JavaScript が必要です。

「再生する」で開始し、「一時停止」するとその姿勢で止まります。「先頭へ戻る」で最初の姿勢に戻せます。画面外へスクロールしたときは停止します。

これは足運びを観察するためのデモです。トップページにある接近・拡大・残像は省き、Canvas 2D API でスプライトの切り替えだけを描いています。

一枚の画像から姿勢を取り出す

素材は、12枚の姿勢を一枚にまとめた WebP のスプライトシートです。各コマの切り出し位置と寸法を指定し、必要な領域だけを表示します。

123456789101112
12コマを一枚にまとめたスプライトシート(1,448 × 1,086px)。青枠はデモで使う9〜12コマ目、黄枠はその先頭である9コマ目の切り出し範囲。画像は gpt-image-2 で生成。

デモで使う4コマは、画像の下段に並んでいます。各領域は幅362px、高さ414pxです。次のコードは、先頭の姿勢を描く部分を抜粋したものです。

スプライトの切り出し
context.drawImage(
image,
0, 672, 362, 414,
0, 0, canvas.width, canvas.height,
);

画像を置き換えるのではなく、同じ画像の参照領域を切り替えます。デモとトップページは、素材とコマ情報を共有しています。

コマごとに時間を変える

均等な間隔で切り替えると、足運びも均等に見えます。現在のトップページでは各コマの表示時間を固定値で指定し、意図的に間を変えています。

このデモが取り出している区間の表示時間は、順に201、373、273、316ミリ秒です。一周は1,163ミリ秒で、2コマ目に少し長い間があります。

1 · 201ms
2 · 373ms
3 · 273ms
4 · 316ms
左から素材の9〜12コマ目。下の棒は表示時間の長さを同じ尺度で表しています。

2つ目の姿勢を長く見せることで、次の足運びに移る前に短い「ため」が生まれます。等間隔の切り替えよりも、ひとまとまりの拍として感じられる間を作っています。

9〜12コマ目の表示時間
const durationsMs = [201, 373, 273, 316];
const cycleDuration = durationsMs.reduce((sum, value) => sum + value, 0);
let time = elapsedMs % cycleDuration;
const frameIndex = durationsMs.findIndex((duration) => {
if (time < duration) return true;
time -= duration;
return false;
});

これは時間からコマを選ぶ処理を簡略化したものです。実装では requestAnimationFrame の時刻を基準にし、経過時間から表示する姿勢を決めます。描画回数を数えて進めないため、端末のリフレッシュレートが変わっても周期は変わりません。

トップページでは奥行きと残像を加える

Blenderで3Dの白馬を動かす案や、動画として配置する案も検討しました。最終的には、姿勢の切り替えとモザイク状の残像を重ねることで、動きの印象をまとめています。

姿勢ごとに切り出し範囲、表示位置、大きさを定めた平面をあらかじめ用意し、経過時間に応じて表示する平面を切り替えています。位置と大きさが段階的に変わることで、白馬がアーチの奥から手前へ近づいてくるように見えます。アーチの奥にいる区間では、ステンシルによって見える範囲を制限しています。

次の図は、白馬の移動経路を検討するためにFigmaで作成したものです。アーチの奥から現れ、右手前へ回り込みながら大きくなる流れを一枚に重ねています。

アーチの奥にいる小さな白馬が、右手前へ回り込みながら段階的に拡大する移動経路の概念図
白馬の位置と大きさを検討した概念図。赤い実線はアーチ、破線は想定した移動経路を示す。実装では曲線上を連続移動させず、姿勢ごとに定めた位置を切り替えている。

下の3枚は、トップページと同じ描画処理で取り出した静止画です。アーチの輪郭を補助線として添え、移動と拡大が分かるよう同じ範囲を表示しています。「残像あり」を切り替えると、同じ姿勢・位置のまま残像の有無を比較できます。

1. アーチの内側
2. 手前へ接近
3. 拡大と残像
静止画で3つの段階を表示しています。

過去の姿勢はすぐに消さず、現在の平面とあわせて表示することで、時間の断片として後ろに残します。古くなるにつれて透明度を下げ、モザイク、色のずれ、規則的なディザによる欠落を加えています。


1992年の白馬と私

今年は午年です。白馬はアーチ内の仮想空間からページの前景へ移動し、異なる空間を飛び越えます。制作面でも、グラフィック、モーション、WebGL 実装といった職域をまたぐモチーフです。

造形では、シュルレアリスムに見られる異なる空間の接続と、初期 CG の離散的な動きや質感を参照しています。写実的な映像の再現ではなく、複数の技術と表現を一つの場面にまとめています。

1992年、乗馬場で白馬に乗る幼少期の筆者と、左端に写る馬を引く男性
原版。おそらく「写ルンです」で撮影。写真を家庭用スキャナーで取り込んだもの。
1992年、乗馬場で白馬に乗る幼少期の筆者
AIによる補正後。左端の人物を除去し、ゴミやノイズ、色味を補正。

ソースコード

デモとトップページを含むサイト全体の実装は、GitHub リポジトリで確認できます。