BLOGブログ

2021.08.25UE4UE/ DCCUE/ Plugin

[UE4]Houdini Engineの紹介

執筆バージョン: Unreal Engine 4.26

こんにちはこんにちは。アートディレクターの黒澤です。
今回は弊社で新しく導入したHoudiniを使用して、Houdini Engine Plug-inを使ったワークフローの改善の話をしたいと思います。

Houdini Engineとは?

まずHoudini Engineとはどんなものかを知っていただくには、こちらの動画を見るのがわかりやすいかと思います。

Houdini Engine for Unreal

またHoudini Engineについて、開発会社のSide-FXは以下のように説明されています。

Houdini Engine は、プロシージャルのノードベースのアプローチをお使いのアプリケーションに持ち込みます。繰り返し行なう作業をノードネットワークとして構築し、それをカスタムスマートアセットとしてまとめ上げます。 こうしたアセットを、 Autodesk® Maya® や Cinema 4D® などを使っている同僚と共有したり、Unity® や Unreal Engine® などのゲームエディタに持ち込むことができます。

Houdiniは非常にプロシージャルに強いDCCツールです。パラメーターだけで形状を作るように組んでおけば、上流工程を差し替えるだけで自動的に変更に対応したモデルを再生成することができます。
Houdini Engineはその上流工程の部分をUnreal EngineなどのHoudini以外のアプリケーションから差し替え、バックグラウンドでHoudiniが計算を行って、結果をそのアプリケーションに戻します。そのため作業者はHoudiniを意識することなく、いつも使っているツールで自動的に更新された結果だけを得ることができます。
例えば、Unreal Engineでパラメーターを変更するだけでランダムに家の間取りを変更したり、家の大きさを変えると自動的に家に合わせてフェンスの大きさが変わったり、家の壁に合わせたツタが配置されたりといったように、Unreal Engineで一つの作業を行うだけで自動的に他の作業も完了することができるのです。

ちなみに最近、Houdini EngineはUnityおよびUnreal版が無償になりました。Houdini FXもしくはHoudini CoreがあればHDA(Houdini Engine用に作られたファイル)を作成できますので、Unreal Engineでパラメーターを変更する担当者の分のライセンスは購入する必要はありません。

Houdini Engine Plugin for Unity and UE4 無償化

また、Houdini EngineはじつはバックグラウンドでHoudiniが動いている必要があるため、ランタイム(ゲームの実行中)に変化させることは出来ません。
この特性はコンストラクションスクリプトによく似ています。コンストラクションスクリプトも人間が手で配置するには手間がかかったり、精密さが求められる配置などを、あらかじめ処理を書いたBlueprintを使って自動化することで作業効率を上げることができます。
コンストラクションスクリプトについては、以前ブログに書きましたので、一読いただけると幸いです。

[UE4] コンストラクションスクリプトでお手軽にプロシージャルなアクターを作る

コンストラクションスクリプトとHoudini Engineでできることの違い

ではコンストラクションスクリプトがあるのに、Houdini Engineを使うメリットとはどのようなものでしょうか?

コンストラクションスクリプトでも様々な自動化ができますが、コンストラクションスクリプトが(というよりもUnreal EngineのBlueprintが)できないことの1つがジオメトリの情報を参照することと、ジオメトリを生成することです。
例えば壁に自動的にツタが這うようなものを作りたいと思った場合、コンストラクションスクリプトでは複雑な曲面に対して生成するのは困難ですが、Houdiniであれば壁の面を参照してそこにランダムにポイントを配置し、最短距離を結ぶようなエッジを作るといった仕組みが作れます。

※ Niagaraは任意のメッシュ状にランダムにポイントを作ることができるので近いことができるかもしれません。

かんたんなHDAの作例

ではHoudini Engineを使った例として、スプラインで作成した範囲にZ軸でランダムの回転が入ったオブジェクトを敷き詰めるHDAを作成してみます。

Houdiniで適当なカーブを書いて、これから作成する処理を確認できるようにしておきます。
Subnetを1つ作り、中に今回求める処理を書きます。SubnetがそのままHDAになるので、Subnetに接続されたカーブがそのままUE4で作成したカーブに置き変え可能です。

Subnetの中身です。
Scatter1(ScatterSOP)でカーブで作られた面にポイントをばらまきます。
random_rotation(Attribute Wangle)にはちょっとしたプログラムを書いています。新たにrotというアトリビュートを作成してY軸(Unreal EngineでのZ軸)にだけランダムな値を入れています。rotアトリビュートはポイントの回転を表します。
attributecreate1(AttributeCreateSOP)で新しくアトリビュートをつくり、アトリビュート名をunreal_instanceにして、値にはUnreal Engineでインスタンス配置したいアセットのパスを入力します。

ScatterSOPで作成するポイントの数を決めるパラメーターを、HDAのパラメーターに登録します。HoudiniがHDAで操作できるパラメーターはそのまま、Unreal Engineでも制御可能です。

出来上がったHDAをUnreal Engineにインポートします。
Subnetの第一入力をUnreal Engineで作ったカーブにしたいので、Curve Inputに変更します。また今回はカーブから作られる面を使いたいのでClosedにチェックを入れます。

カーブを編集するとカーブの中に配置される椅子の位置も変わり、ScatterSOPのポイント数を公開しているので配置する数も変更できます。

RenderDocで確認してみると椅子はインスタンスで配置されていました。インスタンスで配置することで一回のDrawCallで描くことができるので、多くの場合は処理負荷の軽減も見込めます。

簡単ですが、Houdini Engineの紹介でした。

Houdiniはまだまだ勉強中ですが、要望があれば記事を続けていきたいと思います。