こんにちは、トイロジックでTAなどを担当しているオウです。
弊社が企画・開発をしている『Warlander』では、様々なアセットの破壊演出があります。その中の一つに大型の建物を破壊しマップを変えるほどの大規模な破壊演出があり、この演出を実現するためにトイロジックでは独自のシステムとして「大規模破壊演出自動生成システム」を開発しました。
今回はこの「大規模破壊演出自動生成システム」について、「システム概要&レベルデータ処理編」・「シミュレーション編」・「自動化編」の全3回の連載形式に分けて解説していきたいと思います。第1回の今回は「システム概要&レベルデータ処理編」です。
目次
Warlanderの破壊演出について
まず、『Warlander』の破壊演出について説明します。『Warlander』には2種類の破壊演出があり、それぞれにメリットとデメリットがあります。
- リアルタイム計算の「物理破壊」
リアルタイムで計算し、インタラクティブな動きができます。
主に木造建築や小物などの破壊に使用されます。 - Houdiniでシミュレーションした「破壊アニメーション」
事前にシミュレーションが行われるため、負荷が軽く、芸術性の高いコンテンツの作成も可能になります。主にプレイヤーにダメージを与えられる大規模破壊演出に使用されます。
Warlanderでは、城壁や石橋などの石造建築を破壊し、プレイヤーにダメージを与える大規模な破壊演出が可能です。この大規模破壊演出では、プレイヤー同士で破片の位置情報を同期する必要があります。
通常、リアルタイム計算の「物理破壊」では、サーバーが破片の位置などをリアルタイムで計算し、その情報をクライアントに同期する必要があります。しかし、『Warlander』では最大100プレイヤーが同時プレイできるため、この方法は現実的ではありません。
一方、Houdiniでシミュレーションした「破壊アニメーション」では、破片の情報などが事前にクライアントに組み込まれていて、破壊されるタイミングを同期するだけで、全てのクライアントが同じ挙動を再現できます。
そのため、大規模な破壊演出ではHoudiniでシミュレーションした「破壊アニメーション」を採用することにしました。
Houdiniによる大規模破壊演出の自動生成
とは言え、物量的にすべての「破壊アニメーション」をアーティストが手作業で作成するのは、工数的には現実的ではありません。そこで、『Warlander』では大規模破壊演出をHoudiniから自動生成するシステムを構築しました。このシステムを利用すると、シミュレーションしたいマップとオブジェクトをリストアップするだけで、「破壊アニメーション」を自動的に生成することができます。これにより、アーティストの手間を大幅に削減しながらも、効率的な大規模破壊演出を実現できました。
Houdiniのネットワーク
Houdiniのネットワークは、主に以下の四つのハイレベルのHDA(カスタムノード)で構築されています。
※HDAとは、Houdini Digital Assetの略です。
- Destruction Env Loader
レベルデータを読み込み、Houdini内でマップを再現し、不要なオブジェクトをシミュレーションから除外します。 - Destruction Geo
破片の最適化や動力学的な拘束関係などを自動的に構築し、シミュレーションに使うアトリビュートを定義します。 - Destruction Solver
シミュレーションのソルバーで、モーション&コリジョン&VFXデータを生成します。 - PDG Mot Exporter
リストアップしたマップとオブジェクトの「破壊アニメーション」を一気に出力します。
今回は、主に1.Destruction Env Loader
と2.Destruction Geo
の2つのHDAをご紹介します。
Destruction Env Loader
レベルデータ
『Warlander』はトイロジックの自社エンジン「Toylo Engine」で開発されており、レベルデータも独自のフォーマットを使用しています。
レベルデータの読み込み
このレベルデータを読み込むために、まずPythonを使用してデータを分析します。
次に、得られた情報を元に、Houdiniが理解できるようなポイントクラウドを生成します。ポイントの位置はアセットの位置に対応し、アセットの情報はポイントのアトリビュートに設定されます。また、地形は高度情報を元に直接生成されます。
それから、ポイントクラウドからレベルで使用するアセットをリストアップし、Houdini内に読み込んで、ポイントクラウドにインスタンスとして配置します。これにより、Houdini内でマップを再現することが可能になります。
レベルデータの最適化
ただし、読み込んだレベル全体をそのままシミュレーションに使用すると、かなりの負荷がかかります。そこで、シミュレーションに不要なオブジェクトを除外します。
「Destruction Env Loader」ノード
では、そのためのVEXコードスニペット「object filter」
を提供しています。この「object filter」
に特定の配列変数にオブジェクトIDパターンを定義することで、オブジェクトのフィルタリングが可能になります。一般的に、必要なオブジェクトよりも不要なオブジェクトの方が多いため、こちらではホワイトリストを使用しています。
また、コードスニペットのため、配列に対する複雑な処理などはHDAの内部に隠されており、アーティストでも簡単に利用できます。さらに、VEXベースなので、オブジェクトのフィルタリングだけではなく、オブジェクトに対するあらゆる操作が可能であり、使い方によってはかなり強力な機能になれます。
可視化
ツールの制作過程において、可視化やユーザー体験(UX)に直結する機能はしばしば重要視されないことがあります。開発者は通常、機能や性能に焦点を当てる傾向があり、アーティストが実際にツールを使用する際の使いやすさや満足度を見逃すことがあります。その結果、アーティストはツールの使い勝手に不満を感じ、効率的な作業が妨げられるかもしれません。
「Destruction Env Loader」ノード
では、オブジェクトのフィルタリングに対する可視化機能を提供しています。除外されたオブジェクトに色を付け、レベル全体・必要なオブジェクト・除外されたオブジェクトの3つのビジュアルモードを用意しています。また、遠景などの視界を妨げるものを非表示にする機能も提供しています。
そして、最も重要なのは、可視化のオプションがHDAの出力に影響しないことです。そのため、HDA内部で可視化をOutput-1にし、HDAのView Flagも-1に設定することで、ビューアで表示した内容と実際のアウトプットを分離することができます。
Destruction Geo
破壊可能なオブジェクトのリストアップ
「Destruction Env Loader」
で処理したレベルから、破壊可能なオブジェクトをリストアップし、「SIM Objects」のオプション
に反映します。これにより、レベルにある破壊可能なオブジェクトを簡単に選択できます。
ボーン付き破壊オブジェクトの読み込み
『Warlander』では、破壊オブジェクトをより芸術的にコントロールするために、レベルに配置するオブジェクトと破壊後のボーン付きオブジェクトを別々のアセットとして管理しています。オブジェクトが破壊される瞬間にアセットを切り替えることで、破壊演出を実現しています。そのため、破壊可能なオブジェクトを選択してから、実際のボーン付き破壊オブジェクトを読み込む必要があります。
Houdini18以前では、リギングはOBJレベルしかできませんでしたが、Houdini18.5から追加されたKineFXというプロシージャルなリギング&アニメーションのフレームワークにより、SOPレベルでのリギングが可能になりました。この機能を使用することで、ボーン付き破壊オブジェクトを簡単に読み込むことができます。
拘束構築
3DCGにおける破壊FXは、現実世界とは異なり、事前にオブジェクトを破片に分割し、拘束を使って破片を元のオブジェクトのように繋ぎます。衝突を受ける際に、拘束が力に応じて制御され、オブジェクトがその時点で破壊されたように見せます。
今回読み込んだ破壊オブジェクトはすでに分割されているため、そのまま拘束を構築します。破片をクラスター化し、それぞれのクラスターに対応する拘束を構築することで、大きな破片から小さな破片へと粉砕されていくような演出を実現できます。さらに、Soft 拘束を利用することで、コンクリートなどの材質が屈曲しながら粉砕されていくような演出を再現できます。
材質設定
破壊FXが物理的に正しい挙動を示すためには、破片に適切な物理特性を設定する必要があります。「Destruction Geo」
は、オブジェクトIDから材質を分析し、密度、摩擦、反発係数などの自動設定や破片が飛散する際の速度や回転速度などの制限も設定できます。
最適化
破片の凸包化
読み込んだ破壊オブジェクトの破片は、ハイポリゴンであり、凹多面体であることがほとんどです。そのままシミュレーションに使用すると、負荷がかかり、変な挙動が発生する可能性もあります。そこで、破片を凸包化し、シミュレーションのパフォーマンスと精度を向上させます。
シミュレーションの範囲の制限
「Destruction Env Loader」
ではすでに不要なオブジェクトを除外しましたが、さらにシミュレーションの範囲を限定します。読み込んだ破壊オブジェクトを基準に、一定範囲外の地形やオブジェクトを削除します。そして、「Destruction Env Loader」
と同様に、VEXコードスニペット「object filter」も提供しており、高度なカスタマイズが可能です。
可視化
「Destruction Geo」
では、破片を中心から外側に押し出し、破片を色別で表示することで、そのジオメトリがどのように分割されて、どのように拘束されているのかを上手く視覚化することができます。
出力
最後に、「Destruction Geo」
で処理した破壊オブジェクト・ボーン・コリジョン(マップ)を3つのアウトプットに出力して、次の「Destruction Solver」ノードに提供します。
最後に
今回の記事では、『Warlander』の「大規模破壊演出システム」の概要とレベル・オブジェクトデータの読み込みと処理を紹介しました。続編となる第2回では「大規模破壊演出システム」のシミュレーション部分を紹介する予定ですので、ぜひ次回も読んでいただければ幸いです。