見出し画像

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 for UE4で生成したシーン

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

HDAのパラメーター(Houdini)
HDAのパラメーター(Unreal Engine)

洞窟はカーブにCircleSOPをsweepして作成しています。CircleSOPのUniform Scale をそのまま半径というパラメーターでHDAに組み込んでいるため、Unreal Engineから洞窟の半径を編集することができます。

洞窟の断面をパラメーター化

スプライン

Unreal EngineのスプラインをHoudiniが参照することができます。
ObjectMaregeSOPを使用して、そのobject1をパラメーターでHDAで公開すると、Unreal Engineからはアセットやアクターを参照できる特殊なパラメーターになります。このとき参照する対象をWorld Outliner Inputに変更するとレベルに配置されたスプラインを参照できるようになります。
Unreal Engineはスプラインを直接レベルに置くことができず、アクターのコンポーネントの形でしか置くことができないため、スプラインコンポーネントを持ったBlueprintを作成して、それを参照しています。

ObjectMaregeSOPでUnreal Engineの任意のモデルを参照できる
Unreal EngineからObjectMaregeの参照アクターを指定できる

ポリゴンモデル

今回の作成では使っていませんが、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で配置しています。

@unreal_instanceでいろいろなものを配置できる

配置の位置にはそのままPアトリビュートを使用します。回転は@N、スケールは@pscaleもしくは@scaleを使用できます。

ランドスケープ

Houdiniのハイトフィールドが、そのままUnreal Engineのランドスケープに使用できます。Houdiniのハイトフィールドは、Erodeなどの高度な機能があり、なりよりもプロシージャルに処理できるので、おすすめです。

Unreal Material

生成したメッシュのプリミティブに @unreal_materialでStrings型でマテリアルのパスを記載するとマテリアルをアサインできます。

@unreal_materialでマテリアルをアサイン

コリジョン

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_uproperty_XXXでさまざまなプロパティにアクセスできる

複数の種類のコンポーネントを渡すときの注意

今回のように、洞窟はスタティックメッシュを生成、鍾乳石はインスタンススタティックを配置、エフェクトやライトを配置といった具合に、Unreal Engineに複数のコンポーネントを渡すときにはHDAの作り方に注意が必要です。HDAはObjectsネットワークに作成して、メッシュやインスタンスの母点の作成は、その中の個別のGeometyネットワークで作成する必要があります。

ObjectsネットワークでHDAを作成 コンポーネントごとにGeoを分ける

これらのGeometyネットワーク同士で参照する場合は、必ず相対パスで指定してください。絶対パスで指定すると参照できません。

相対パスで指定

まとめ

  • Houdini Engine for Unreal Engineでは、HDAのパラメーターだけでなく、さまざまなデータをUnreal Engineから受け取って、Houdiniにわたすことができ、Unreal EngineもHDAのデータを解釈して、メッシュの生成から、アセットの配置まで行えます。

  • @unreal_upropertyを使えばUnreal Engineのさまざまなプロパティにアクセスできます。

  • Unreal Engineにわたすものが、複数のコンポーネントに及ぶ場合は、ObjectsネットワークにHDAを作りましょう。

明日は、@70_cg_artさんの「個人向けのフォルダ構成周りについて書きます」です。おたのしみに!


この記事が気に入ったらサポートをしてみませんか?