こんにちは、トイロジックでTAなどを担当しているオウです。
弊社が企画・開発をしている『Warlander』では、様々なアセットの破壊演出があります。その中の一つに大型の建物を破壊しマップを変えるほどの大規模な破壊演出があり、この演出を実現するためにトイロジックでは独自のシステムとして「大規模破壊演出自動生成システム」を開発しました。
今回はこのシステムを詳しく解説し、「システム概要&レベルデータ処理編」・「シミュレーション編」・「自動化編」の3回に分けてご紹介しております。今回は最終回として「自動化編」をお届けいたします。
目次
前回のおさらい
『Warlander』では、大規模破壊演出をHoudiniから自動生成するシステムを構築しました。このシステムを利用すると、シミュレーションしたいマップとオブジェクトをリストアップするだけで、「破壊アニメーション」を自動的に生成することができます。これにより、アーティストの手間を大幅に削減しながらも、効率的な大規模破壊演出を実現できました。
Houdiniのネットワークは、主に以下の四つのハイレベルのHDA(カスタムノード)で構築されています。
- Destruction Env Loader
レベルデータを読み込み、Houdini内でマップを再現し、不要なオブジェクトをシミュレーションから除外します。 - Destruction Geo
破片の最適化や動力学的な拘束関係などを自動的に構築し、シミュレーションに使うアトリビュートを定義します。 - Destruction Solver
シミュレーションのソルバーで、モーション&コリジョン&VFXデータを生成します。 - PDG Mot Exporter
リストアップしたマップとオブジェクトの「破壊アニメーション」を一気に出力します。
破壊FX自動化の可能性
Houdiniでは、背景やLODなどの自動生成についてはよく耳にすると思いますが、ダイナミクス関連の自動化についてはあまり聞いたことがないのではないでしょうか?
その理由は、ダイナミクスシミュレーションは入力によって結果が大きく変わるためです。こちらのテストシーンをご覧ください。
ボールが壁に衝突するシーンです。壁の破片数以外、他の全ての設定は同じです。同じような演出を期待しましたが、左のシーンでは壁が全壊したのに対し、右のシーンでは壁の中央部分しか崩れませんでした。このように、入力の差が大きいほどシミュレーションの結果も大きく変わってしまうのです。
したがって、基本的にVFXはアーティストが一つ一つ丁寧に作り上げなければなりません。
業界初の破壊FX自動生成システム
では、破壊FXの自動化は不可能でしょうか?
破壊FXを調整する際、アーティストは感覚だけで調整しているわけではありません。物理ベースのため、きちんとしたルールがあります。そのルールをアルゴリズム化すれば、簡単な設定だけでアーティストが調整したかのように、どんな入力に対しても似たような演出を実現できます。
こちらのテストシーンは、先ほどと同じ設定を使用し、Destruction Solver
でシミュレーションしたものです。ご覧の通り、左右で似たような演出が実現できました。
出力の自動化
前回の記事では、Destruction Solver
が選択したマップとオブジェクトに対して、破壊モーション・コリジョン・VFXデータを生成できるとご紹介しました。しかし、大量のマップとオブジェクトがある場合、一つ一つ選択して出力するのは非常に労力と時間がかかります。そこで、HoudiniのPDG機能を使って出力の自動化を行います。
PDGは、PROCEDURAL DEPENDENCY GRAPHの略称で、タスク分散と依存関係管理のために設計されたプロシージャルアーキテクチャです。映像制作やゲーム・VR 開発などのコンテンツパイプラインの拡張、自動化、分析を可能にします。
PDG Mot Exporterノードは、PDGを使用して構築したハイレベルHDAです。PDGを使用することで、マップとオブジェクトをリストアップするだけで、「破壊アニメーション」を一気に出力できます。
これにより、アーティストは手動で行う必要がなくなり、時間と労力を大幅に節約できます。
リストアップしたものを一気に出力
リストアップしたものを一気に出力するために、Wedgeノードを使います。Wedgeノードは、指定した1つ以上のアトリビュートのバリエーション毎にワークアイテム(ジョブ)を生成します。
つまり、特定のパラメータをWedge化すれば、設定したワークアイテム数に応じて、対応するバリエーションが生成されます。
PDG_mot_exporter
は、マップとオブジェクトなどのパラメータをWedge化することで、指定したアセットを一気に出力します。
エラー検知
入力されたアセットは人間が作成する限り、常に完璧であるとは限りません。不適切な入力をそのまま使用してアセットを出力すると、ビルドエラーやビルドのクラッシュなどが発生する恐れがあります。
そのため、エラー検知の仕組みを導入することが非常に重要です。
PDG_mot_exporter
では、Errorノードを使用して、条件が満たされない場合にそのワークアイテムにエラーを出します。エラーが発生したワークアイテムはスキップされ、出力されません。
この仕組みにより、不適切な入力による問題を未然に防ぎ、安定したアセット生成が可能になります。
Houdini外部からのPDG実行とパラメータ上書き
Houdini外部から、Pythonスクリプトを使用して、ネットワーク内のパラメータの上書きと、PDGネットワークの実行が可能です。
hou.Parm.set(value, language=None, follow_parm_reference=True)
このメソッドを使用することで、Houdini内のパラメータ値を外部から設定し、指定したいマップやオブジェクトを上書きすることができます。
これにより、Houdiniの知識やライセンスを持たなくても、「破壊アニメーション」などの出力を容易に設定できます。
//Houdini19以後
hou.TopNode.cookWorkItems(block=False, generate_only=False, tops_only=False, save_prompt=False, nodes=[])
//Houdini19以後
hou.TopNode.cookOutputWorkItems(block=False, generate_only=False, tops_only=False)
//※Houdini19以後廃止
hou.TopNode.executeGraph(filter_static=False, block=False, generate_only=False, tops_only=False)
そして、これらのメソッドを使って、指定したPDGネットワークを生成して実行できます。hou.TopNode.cookOutputWorkItems
はhou.TopNode.cookWorkItems
とほぼ同じですが、PDGネットワーク内のOutputノードをクックします。
Jenkinsによる自動ビルド
Jenkinsは、オープンソースの継続的インテグレーション(CI)および継続的デリバリー(CD)ツールです。ゲーム開発プロセスにおいて、ゲームソースコードのビルド、テスト、デプロイメントなどの自動化を支援します。
Jenkinsを使用することで、定期的な自動ビルドを設定することが可能です。これにより、変更されたレベルを基に、自動的に「破壊アニメーション」を出力し、ゲームビルドを作成することができます。
Slack通知
ビルドの成功や失敗などの重要なイベントを通知するために、Jenkinsはさまざまな通知メカニズムを提供します。弊社は主にSlackを使用し、ビルドのイベント通知をBOTを介して開発者に伝えています。
まず、HoudiniのPDGネットワークから検知した情報をJenkinsのログ情報に送信します。そして、Jenkinsはこれらの情報を分析し、BOTを通じてSlackで関係者にメンション付きメッセージで伝達します。
この仕組みにより、エラーが発生した場合でも、迅速に問題を解決できるようになっています。
最後に
この「大規模破壊演出自動生成システム」では、Houdiniを使用して、弊社エンジンからレベルなどの情報を読み取り、自動的に「破壊アニメーション」を生成します。さらに、Jenkinsを利用して、定期的にHoudiniのジョブを実行し、最新の情報をゲームビルドに反映させます。
このシステムにより、大幅な工数削減が実現され、アーティストがより芸術的な部分に注力できるようになりました。
トイロジックでは、エフェクトに興味がある、得意なテクニカルアーティストを募集中です。 この記事を読んで興味を持たれた方はぜひ採用ページを見てください。