要約:カーゴポッドの飛行アニメーションの仕組みを開発者Hrusaが詳しく解説した技術記事。ステーション抽象化レイヤー(Surface/Force/Station/Hatch)による柔軟な輸送ルーティング、ベジェ曲線で制御される完全Mod対応のプロセッションシステム、深度テクスチャによるシームレスなクラウド遷移、そしてMod同士の衝突を防ぐカタログシステムが紹介されています。


以下は2024年11月15日に公開されたFriday Facts #437 – Cargo Pod Deep Dive(著者:Hrusa)の日本語訳です。


どうも、

今週はカーゴポッドの仕組みとシームレスな飛行アニメーションを深掘りします。拡張を遊んだ方はすでにゲーム内で目にしたことでしょう。好意的な反応をいただき、とても嬉しく思っています。

ナウビス上空の宇宙プラットフォームへ上昇する様子

ビジュアルデザイン

爪からポッドが分離するという初期コンセプトはEarendelによるものです。その本質は開発を通してほとんど変わっていません。最初のバージョンではロケットに乗るためにカプセルアイテムを入れる必要がありましたが、「無意味な作業」としてカット。ただしそのアイテムはメックアーマーの材料のひとつだったため、見た目の類似性が残っています。Earendelのドラフトを受けて、Jerzyが爪ロケットとポッドの3Dモデルを制作しました。

ポッドのコンセプトアート
Earendelによるポッドとロケット分離のコンセプトアート

その後、コアのゲームプレイコーディングが完了するまでこのブランチは長い間休眠状態でした。ファンシーな飛行アニメーションのような重要度の低い機能に手が回ったとき、ハブ・パッド・ハッチのモデリング作業を終えたばかりのJaroslawの助けを借りました。彼のモデリングとボリューメトリッククラウドシミュレーション、Hrusaのコーディングとシェーダーワーク、Ianのオーディオで仕上げました。

ポッドの行き先は?

グラフィック作業を始める前に、アイテムがあるサーフェスから別のサーフェスにどう移動するかのバックボーンを開発する必要がありました。当時、ロジスティックリクエストは動いていましたが、アイテムは瞬間テレポートしていました。

インベントリを持ちアイテムを運べるロケットにヒントを得て、カーゴポッドを独自のエンティティにすることにしました。ロケットはサイロからの発射を担当し、元のサーフェスで切り離されます。ポッドが別サーフェスへの移動機能を持ちます。

より厄介なのが行き先の問題でした。バニラのSpace Ageでもポッドはサイロからハブへ、ハブからランディングパッドへと移動します。カーゴベイで拡張するとハッチが増えますが、それ自体は行き先ではありません。

ステーションシステム

解決策は「ステーション」という抽象化レイヤーの導入でした。軌道ロジスティクスに関わるすべての建物が自分の勢力に登録してユニークIDを受け取ります。カーゴベイのハッチは既存のステーションに合流するだけです。

アイテムの宛先指定に必要なのは4つの要素だけ:

  • Surface(サーフェス)
  • Force(勢力)
  • Station(ステーション)
  • Hatch(ハッチ)

用途によっていくつかは省略可能です。スターターパックのロケットに行き先は不要。プレイヤーの移動では惑星に向けて発射し、地上かパッドかは頂点で決定。ロジスティック注文なら事前にステーションが分かっています。

汎用ロジックの素晴らしいところは、技術的にゲーム内の任意の2サーフェス間で輸送でき、ステーション数も制限がないことです。バニラでもロケットサイロから自分のランディングパッドにスペースサイエンスを送る機能が「何もしなくても動いた」のはこの仕組みのおかげです。惑星とプラットフォームだけにハードコーディングしてポテンシャルを制限したくなかったのです。

ステーションGUIのメモ
サイロ・ハブ・パッドのGUIを統合しようとした時のメモ。結局ニーズが違いすぎて断念。

カットシーンパズルの組み立て

ステーションシステムと同様に、アニメーションもハードコーディングは避けたかった。カスタム惑星はModとして最初に追加されるものの一つなので、できるだけカスタマイズ可能にすることを優先しました。

飛行アニメーションの細部すべてが、完全にMod対応のプロセッションシステムで提供されます。各宇宙のロケーションが、惑星への到着・出発、軌道上の宇宙プラットフォームへの到着・出発のアニメーションセットを独自に持ちます。

たとえばヴルカヌス軌道のプラットフォームからヴルカヌス表面にポッドを飛ばす場合、「vulcanus-platform-departure」と「vulcanus-planet-arrival」のスタイルが合うアニメーションを取得してつなぎ合わせます。ハッチが開くのを待つ場合は「vulcanus-style-intermezzo」のループアニメーションが間に挿入されます。

ビルディングブロック

さらに踏み込むと、各プロセッションは可変数のレイヤーで構成されたタイムラインです。レイヤーはアニメーションの様々な側面を制御したりグラフィックを描画します。その多くは1D、2D、4Dのベジェ曲線とその正規化版で駆動されています。

スプラインエディタ
Factorioスプラインエディタで開いた惑星着陸カーブ

Modder向けにカスタムのFactorioスプラインエディタをオンラインで公開しています。これなしで正しい形状を得るのはかなり難しい。おまけに、カーブを必要なフォーマットで直接エクスポートしてくれます。

軌道上のプラットフォームからナウビスへ降下する様子
プロセッションタイムライン
プラットフォームから地表への飛行を簡略化したタイムライン。各レイヤーがいつアクティブになるかを示す。

クラウドテクノロジー

アニメーションをシームレスに見せているのがカバーレイヤーです。ポッドがあるサーフェスから別のサーフェスにテレポートする瞬間、画面全体を覆い隠す必要があります。単純にフラット画像を画面にスワイプするだけでも機能はしたでしょう。実際、Albertはよりスタイリッシュな美学に寄せたいと考えていました。

しかし少しの手間でとても印象的なアニメーション付きエッジが実現できると考えました。やったことは、Jaroslawにクラウドの深度テクスチャを生成してもらっただけです。エッジがフェードする時、フラットな値で乗算する代わりに、特定の深度でクラウドを切り取ります。こうすると雲が塊で画面に自然に現れ、厚い壁のようにはなりません。

カバーレイヤーのソフトマスキングシェーダーを手動でデモ

Modの衝突を防ぐ ― カタログシステム

この機能は非常に強力ですが、Space Ageの最終カットシーンを作り始めた時、このままではModが共存できないことに気づきました。アニメーションのすべてがタイムライン内にあるなら、新しいポッド・惑星・ステーションは既存のすべてのプロセッションに自分を統合するために膨大な作業が必要になります。スプライトが数個違うだけの複製が大量にできてしまう。

そこで導入されたのがカタログシステムです。現在のバージョンでは、惑星はすべて実際には同じフライトアニメーションのプロトタイプを使っています。適切なバリエーションを導入しているのがカタログです。カタログは画像やサウンドのリストで、プロセッションアニメーションが参照できます。事前定義のアセットではなく、CatalogueIDを参照して参照先を指定します。

  • Space Locationカタログ:その場所の雲や霧の見た目を提供
  • Podカタログ:ソーラーパネルの展開や、再突入炎のオーバーレイテクスチャ、スラスターの音などを提供
  • Hatchカタログ:ポッドのスラスターが近づいた時のイルミネーション

グラフィックやサウンドが不足していれば単にスキップされます。新しい惑星Modが雲の定義を忘れても、少なくとも基本的なアニメーションは再生されます。新しいポッドModは独自の炎スプライトだけ提供すれば、適切なタイミングで再生されます。新しいカーゴベイやハブは自分のイルミネーションだけ変えて、プロセッションデータには触れなくてOK。

凝りたければ惑星に完全に新しいタイムラインを与えつつ、デフォルトのSpace AgeカタログIDからポッドアニメーションや惑星スプライトを再利用できます。たとえばパラシュートのスプライトをポッドカタログに追加して飛行速度を大幅に遅くする、という使い方も可能。サードパーティのポッドModはパラシュートのグラフィックだけ定義するだけであなたの惑星をサポートできます。

📖 原文を読む(英語)