ひとことで
動いている物やカメラを振ったときに、移動した方向へ像を流す表現です。現実のカメラは、シャッターが開いている間の像を 1 枚に重ねて記録するので、速く動く物はぶれて写ります。ゲームでは、各画素が前のフレームから画面上でどれだけ動いたか(モーションベクトル)を描き、その向きに沿って色を平均することで再現します。速さの感覚を伝え、低いフレームレートでも動きをなめらかに見せます。
ゲームでの使いどころ
- スピード感:レースゲームの背景の流れ、高速で走るキャラクター、落下や突進。
- カメラの動き:素早く振り向いたときの画面の流れ。
- 攻撃の軌跡:剣や拳の動きを流して、打撃の勢いを強調する(オブジェクト単位のブラー)。
- 30 fps のゲーム:フレームの間を補って、カクつきを目立たなくする。
しくみ
1. モーションベクトルを描く:各物体を描くとき、今のフレームの位置と、前のフレームの位置(前の物体の行列 × 前のカメラの行列)の両方を計算し、画面上の差を書き出します。
物体が動いた分とカメラが動いた分の両方が含まれます。このバッファは TAA の再投影にも使うので、現代のエンジンではほぼ必ず用意されています。
2. 動きの方向にぼかす:各画素で、モーションベクトルに沿って前後の色を数か所読み、平均します。
はシャッターの開いている割合で、映画でよく使われる「180° シャッター」はフレーム時間の半分()です。
実装のポイント
- 前のフレームの行列を保存する:物体ごと、骨ごと(スキニング)に前のフレームの行列を保存しておく必要があります。
- フレームレートに依存させない:実際のフレーム間隔が変わっても同じ見た目になるよう、ベクトルを基準のフレーム時間に換算します。
- タイル化で輪郭を正しく:動く物の輪郭の外側(背景側)にもぶれがはみ出すべきなので、実際のゲームでは画面を小さなタイルに分けて、周囲の最大の速度を使う方法(McGuire の手法)を使います。
つまずきやすい点
- 酔いやすさ:カメラの回転によるブラーは、プレイヤーによっては画面酔いの原因になります。オプションで無効にできるようにするのが一般的です。
- UI や照準がぶれる:画面に固定された物(UI、一人称視点の武器)は、カメラと一緒に動くのでベクトルが 0 になるべきです。
- 急なカット:カメラが瞬間移動したフレームで、巨大なベクトルが生まれて画面全体が流れます。カット時は前のフレームの行列をリセットします。
デモで試すこと
- 高速で回るドローンの光の輪が、回る方向へ流れています。「ドローンの速さ」を上げると、流れが長くなります。
- 「カメラを回す」をオンにすると、背景全体が回転方向に流れます。
- 「モーションベクトルを表示」で、各画素の画面上の動きを確認できます。動いている部分ほど明るく表示されます。
- 「シャッター」を 0 にするとぶれがなくなり、1 以上にすると長く流れます。