MODなしでカメラカットシーンを作る:キーフレーム、補間、スペクテイターのテクニック
バニラでカメラを動かす方法はひとつ——毎tick実行するテレポート関数——そしてその周囲の雰囲気を演出するのがタイムラインレジストリだ。それぞれの得意分野と、ロボットのような動きを防ぐスムージングについて解説する。
バニラにはカメラというオブジェクトが存在しないため、カットシーンはテレポートで組み立てるイリュージョンであり、その周囲の世界を変えるタイムラインが添えられる。
方法1:毎tickプレイヤーをテレポートさせる
古くからある万能な方法。プレイヤーをスペクテイターにして、パスに沿って動かす:
gamemode spectator @s
tp @s 100.0 70.0 200.0 -90.0 10.0
関数チェーンから毎tick1回のtp。すべてのバージョンで動作し、特別なものは何も必要ない。問題はすべて滑らかさに関するものだ:
- 毎秒20キーフレーム。 10秒のショットは200行の
tpになる。 - 線形ステップは機械的に見える。 実際のカメラの動きは加減速する。
- 回転のラップが厄介。 yaw 170から-170への移動は20度の回転だが、素朴な補間では340度逆方向に回ってしまう。ステップ前に角度差を-180…180の範囲に正規化すること。
これらの行を生成するのがキーフレームツールの役割だ——いくつかの位置を置けば、イージングを適用した毎tick関数を出力してくれる。
イージング
アマチュアと観られるものの差は補間カーブにある。2つのキーフレーム間で、tを0から1として:
linear t
ease-in-out t < 0.5 ? 2t² : 1 − 2(1−t)²
smoothstep t² × (3 − 2t)
smoothstepが安全なデフォルトだ。位置と回転に同時に適用しないと、回転が終わる前にカメラが到着してしまう。
方法2:タイムライン——カメラ以外のすべてのために
最近のバージョンでtimelineレジストリが追加され、カメラトラックとして読めてしまいそうになる:
data/<namespace>/timeline/intro.json
しかしそうではない。タイムラインはワールドクロックに対して動作し、環境属性——空と霧の色、環境音と音楽、ライト——をネイティブ補間でキーフレームする。プレイヤーを動かすことはできないので、カメラ自体は依然として方法1だ。タイムラインが得意なのはカットシーンの雰囲気づくり:空をフェードさせ、霧を移行させ、音楽をテレポートに合わせて切り替える——それぞれに毎tickコマンドを書くことなく。
代償は最近のバージョンにしか存在しないことで、古いクライアントを対象とするマップでは/timeと/weatherで雰囲気を偽装する必要がある。
プレイヤーをその場に留める
テレポートパスは2つのものと戦う:
- プレイヤーの入力。 スペクテイターではプレイヤーが撮影中に飛び去れてしまう。毎tickの再テレポートがそれを上書きする——これが力技の方法が生き残る理由のひとつだ。
- チャンクロード。 未ロードの場所へカメラが飛ぶと虚空が映る。撮影前にパスを
/forceloadし、終わったら削除する。
HUDを隠す
スペクテイターモードとF1でほぼ事足りる。クリーンなフレームのためには、HUDスプライトを空白にするリソースパックが、プレイヤーが何も押さずにクロスヘアとホットバーを消せる——HUDガイドを参照。
パス上にキーフレームを置いて毎tick関数をエクスポートし、その周囲のシーンを演出するタイムラインを構築しよう——Cutscene & Timeline Buildersを使って。