MODなしでカメラカットシーンを実装する方法:キーフレーム、補間、そしてスペクテイターモードの活用
バニラ環境でカメラを動かす2つの方法 — ティックごとのテレポート関数とタイムラインレジストリ。それぞれの利点と、ロボットのような動きを防ぐためのスムーズ化について解説します。
バニラ環境にはカメラオブジェクトが存在しないため、カットシーンは2つの錯覚のいずれかによって実現されます。
方法1:プレイヤーを毎ティックテレポートさせる
古くからある普遍的な方法です。プレイヤーをスペクテイターモードにし、パスに沿って移動させます。
gamemode spectator @s
tp @s 100.0 70.0 200.0 -90.0 10.0
これは、関数チェーンから毎ティックtpを実行することで実現されます。すべてのバージョンで動作し、特別なものは何も必要ありません。問題はすべてスムーズさに関するものです。
- 1秒あたり20キーフレーム。 10秒のショットは200行の
tpになります。 - 線形ステップは機械的に見える。 実際のカメラの動きは、ゆっくりと開始し、ゆっくりと終了します。
- 回転のラップが悪い。 ヨー角170度から-170度への移動は20度の回転ですが、単純な補間では340度逆方向に回転してしまいます。ステップする前に、角度の差を-180〜180度の範囲に正規化してください。
これらの行を生成するのがキーフレームツールの役割です。いくつかの位置を配置するだけで、イージングが適用されたティックごとの関数が出力されます。
イージング
アマチュアと視聴に耐えうるものの違いは、補間曲線にあります。2つのキーフレーム間で、tが0から1の場合:
linear t
ease-in-out t < 0.5 ? 2t² : 1 − 2(1−t)²
smoothstep t² × (3 − 2t)
smoothstepは安全なデフォルトです。位置と回転に同時に適用しないと、カメラが回転を終える前に到着してしまいます。
方法2:タイムラインレジストリ
新しいバージョンでは、ショット全体を数百のテレポートではなくデータとして記述するタイムライン形式が追加されました。
data/<namespace>/timeline/intro.json
時間と補間モードを持つキーフレームが、単一のコマンドで再生されます。利点:
- はるかに小さい。 200回のテレポートではなく、6つのキーフレームで済みます。
- 補間がネイティブなので、手動でのイージング計算は不要です。
- フレームレートに依存しない — ロードされたサーバー上でティックごとのテレポートのように途切れることはありません。
欠点は、最近のバージョンにしか存在しないため、古いクライアントを対象とする地図では依然として方法1が必要になることです。
プレイヤーを固定する
どちらの方法も2つのことと戦います。
- プレイヤーの入力。 スペクテイターモードでは、プレイヤーがショットの途中で飛び去ってしまう可能性があります。毎ティック再テレポートすることでこれを上書きできますが、これが力ずくの方法が残っている理由の1つです。
- チャンクの読み込み。 アンロードされた場所にカメラが飛ぶと、虚空が表示されます。ショットの前にパスを
/forceloadし、ショット後に削除してください。
HUDを非表示にする
/gamerule doImmediateRespawn、スペクテイターモード、F1キーでほとんどの目的は達成できます。クリーンなフレームを得るには、HUDスプライトを空白にするリソースパックを使用すると、プレイヤーが何も押さなくてもクロスヘアとホットバーが削除されます — HUDガイドを参照してください。
パス上にキーフレームを配置し、Cutscene & Timeline Buildersを使用して、ティックごとの関数またはタイムラインJSONのいずれかを出力します。