Houdini Engine for Unreal Engine ことはじめ
この記事はHoudiniアドベントカレンダー2021、7日目の記事です。
今年の夏、ついに Houdini を会社で導入しました!
決め手になったのは Houdini Engine for Unreal Engine の無償化です。
Houdini Engine for Unreal Engine とは 、Unreal Engine にインポートしたHDAを編集することで、バックグラウンドで起動した Houdini が更新を行い、 Unreal Engine に結果を返してくれるプラグインです。
このプラグイン使用することで、Houdiniを使用していないスタッフでも Houdini のパワーを Unreal Engine から使うことができるのです!
Houdiniは単体でも魅力的なツールなのですが、無償化により、より多くのスタッフのワークフローに影響できるより魅力的なツールになったと言えるでしょう。
執筆バージョン
Houdini 18.5.563
Unreal Engine 4.26
Houdini Engine V2
作例
Houdini Engineでどんなことができるかという作例のために洞窟のシーンを作りました。
この洞窟はUnreal Engineで作成したカーブに合わせて自動的に生成されます。洞窟のメッシュだけでなく、天井の鍾乳石の配置、側面の岩の配置、ポイントライトの生成、水面の生成、天井から滴る水のエフェクトの配置までを自動で行っています。
Unreal Engine から受け取れるもの
HoudiniとUnreal Engineの連携で最初に把握しておきたいことは、Unreal Engine のどんなデータを受け取って、どんなデータを渡すことができるか、です。まずは Unreal Engine から受け取れるデータを解説します。
HDAのパラメーター
作成したHDAのパラメーターをUnreal Engineからコントロールすることができます。Integers/Floats/Strings/Buttons/Colors/Files/Folders/Ramps/…といったさまざまなタイプを扱えます。
ライトの色のタイプをColorsにしていないのは、Unreal EngineからColorsタイプを編集できなかったからです(ドキュメントにはColorsタイプも扱えると書いているので、一時的なバグかもしれません…表示はできるのですがなぜか動かないんですよね)。しょうがないのでVerctorで扱っています。
https://www.sidefx.com/docs/unreal/_parameters.html#ParametersColor
洞窟はカーブにCircleSOPをsweepして作成しています。CircleSOPのUniform Scale をそのまま半径というパラメーターでHDAに組み込んでいるため、Unreal Engineから洞窟の半径を編集することができます。
スプライン
Unreal EngineのスプラインをHoudiniが参照することができます。
ObjectMaregeSOPを使用して、そのobject1をパラメーターでHDAで公開すると、Unreal Engineからはアセットやアクターを参照できる特殊なパラメーターになります。このとき参照する対象をWorld Outliner Inputに変更するとレベルに配置されたスプラインを参照できるようになります。
Unreal Engineはスプラインを直接レベルに置くことができず、アクターのコンポーネントの形でしか置くことができないため、スプラインコンポーネントを持ったBlueprintを作成して、それを参照しています。
ポリゴンモデル
今回の作成では使っていませんが、Unreal Engineのスタティックメッシュ、スケルタルメッシュ、BSPなどのポリゴンモデルをHoudiniで読み込むことができます。スプラインと同じようにObjectMaregeSOPで任意のレベル上のアクターを参照できます。
ObjectMaregeSOPでの参照は複数のモデルも可能です。Houdiniで複数のメッシュをまとめてボリューム化することで、オブジェクトを融合させることもできます。
また、参照する対象をWorld Outliner Inputではなく、Geometry Inputにすることで、レベル上のトランスフォームを加えずにモデルをそのまま参照できます。これは特定のモデルをリダクションしたい、などの目的に使います。
ほかにもLandscapeもインポートできるようですが、こちらはまだ試したことがありません。
Unreal Engine に渡せるもの
生成したスタティックメッシュ
Houdiniで生成したメッシュはスタティックメッシュとして自動的にUnreal Engineに読み込まれます。今回の例では洞窟と水面は生成されたスタティックメッシュです。
インスタンス配置
Houdiniのポイントに@unreal_instanceを作成して、文字列型でスタティックメッシュのパスを入力すると、インスタンスドスタティックメッシュコンポーネントでアセットを配置できます。
鍾乳石をこの手法で配置していますが、洞窟全体の面積をscatterの数に反映しているので、洞窟が広くなれば自動的に鍾乳石も多くなります。
@unreal_instanceで配置できるのはスタティックメッシュに限りません。スタティックメッシュのパスの代わりに、パーティクルエフェクトのパスを入力すればエフェクトを配置でき、PointLightと表記すればポイントライトを配置できます。デカールなども同じ方法で配置できます。
今回の作例では、鍾乳石、側面の岩、ポイントライト、滴る水のエフェクトを@unreal_instanceで配置しています。
配置の位置にはそのままPアトリビュートを使用します。回転は@N、スケールは@pscaleもしくは@scaleを使用できます。
ランドスケープ
Houdiniのハイトフィールドが、そのままUnreal Engineのランドスケープに使用できます。Houdiniのハイトフィールドは、Erodeなどの高度な機能があり、なりよりもプロシージャルに処理できるので、おすすめです。
Unreal Material
生成したメッシュのプリミティブに @unreal_materialでStrings型でマテリアルのパスを記載するとマテリアルをアサインできます。
コリジョン
collision_geo_simple_capsule などの名前でプリミティブグループを作成すると、そのグループは非表示のコリジョン専用のメッシュになります。simple_capsuleとついていると、そのプリミティブグループを囲うようなカプセル型のコリジョンが生成されます。
rendered_collision_geo などのように接頭詞にrendered_とつけると、表示もできるメッシュになります。
ちなみに、コリジョンを生成しないメッシュってどう書けばいいんでしょうか…?
uproperty
コリジョンを生成しないメッシュの作り方はわからないのですが、アクターを表示する際にNo Collisionで配置する方法はあります。Unreal Engineのupropatyを介して、HoudiniからCollision Enabledのプロパティを編集する方法です。
No Collision で配置するには、プリミティブに@unreal_uproperty_CollisionEnabledを作り、stringsでNoCollisionと入力します。
upropatyはどんなプロパティにもアクセスできるので、ポイントライトの配置では、ライトの色、ライトが届く範囲、ライトのソース(反射に映るライト)のソフト半径を設定しています。
複数の種類のコンポーネントを渡すときの注意
今回のように、洞窟はスタティックメッシュを生成、鍾乳石はインスタンススタティックを配置、エフェクトやライトを配置といった具合に、Unreal Engineに複数のコンポーネントを渡すときにはHDAの作り方に注意が必要です。HDAはObjectsネットワークに作成して、メッシュやインスタンスの母点の作成は、その中の個別のGeometyネットワークで作成する必要があります。
これらのGeometyネットワーク同士で参照する場合は、必ず相対パスで指定してください。絶対パスで指定すると参照できません。
まとめ
Houdini Engine for Unreal Engineでは、HDAのパラメーターだけでなく、さまざまなデータをUnreal Engineから受け取って、Houdiniにわたすことができ、Unreal EngineもHDAのデータを解釈して、メッシュの生成から、アセットの配置まで行えます。
@unreal_upropertyを使えばUnreal Engineのさまざまなプロパティにアクセスできます。
Unreal Engineにわたすものが、複数のコンポーネントに及ぶ場合は、ObjectsネットワークにHDAを作りましょう。
明日は、@70_cg_artさんの「個人向けのフォルダ構成周りについて書きます」です。おたのしみに!
この記事が気に入ったらサポートをしてみませんか?