UnrealのSpline Componentを入力にしてHoudiniで処理し、その結果をまたUnrealのSpline Componentとして受け取るまでの手順です。

SplineComponent を入力として受け取り、SplineComponentが返ってくるHDAです。

出力したSplineは、Blueprintから Get Location at Distance Along Spline でサンプリングしたり、Niagaraに渡してトレースさせたりなどしてます。

※ 前提としてHoudini Engine for Unreal をプラグインとして有効にし、対応するバージョンのHoudiniをインストールしてるものとします。

〇 Unreal上でHDAをベイクした結果 Unrealに出力されたスプライン

〇 出力スプラインに沿うようにNiagaraエフェクトを表示 Niagaraでトレースさせたところ

1. ネットワークをサブネット化する

HDAにしたいSOPネットワークを用意します。

ここでは入力カーブに沿って猫の輪郭をスキャッターするネットワークです。

HDA化する前のSOPネットワーク

HDAにしたいノードを全部選択して Shift + C でサブネット化します。

Shift + C でサブネット化

ここで必ずSOPのサブネットにするのが大事です。ノード入力(Sub-Network Input)はSOPサブネットにしかないので、OBJレベルのコンテナだとUnreal側にノード入力が出てきません。

2. HDAを作成する

サブネットを右クリックして Create Digital Asset...

右クリックからCreate Digital Asset

Asset Label と保存先を決めて Create します。

New Sop Digital Assetダイアログ

3. 入力の名前に "World" を入れる

作成後に開く Type Properties の Input/Output タブで、Input 1 Label を Sub-Network World Input #1 に変えます。

Type PropertiesのInput/Outputタブ

指定名称をラベル名に含むことで、Unreal側でHDAを配置したときのデフォルトの入力タイプを指定することができます。名前に World が入っていないと Geometry Input で立ち上がってしまい、毎回手動で切り替えることになります。

公式ドキュメントに指定名称の記載例があります

今回試したのは World Input だけですが、curve を含めれば Curve Input が初期値になるはずです。

4. 出力をSpline Componentにする

スプラインとして返すには、出力するカーブに primitiveアトリビュートを3つ 付けます。Primitive Wrangleで書きます。

i@unreal_output_curve = 1;
i@unreal_output_curve_linear = 1;
i@unreal_output_curve_closed = i@loopclosed;
  • unreal_output_curve … HoudiniのカーブをUnrealのSpline Componentとして出力するための属性です。この属性を付与しない場合、カーブはSpline Componentとしては出力されません。
  • unreal_output_curve_linear … Unreal側スプラインの補間タイプ。1 でLinear、0 だとカーブ補間になります。
  • unreal_output_curve_closed … Unreal側で Closed Loop にするかどうか。ここでは自前の i@loopclosed を渡していて、HDAパラメータから閉じる/閉じないを切り替えられるようにしています。

5. Unrealで入力を繋ぐ

HDAをレベルに配置して、Details の Houdini Inputs を開きます。名前を付けておくと World Input が最初から選ばれています。

World InputでStart Selectionを押す

  1. Start Selection を押す
  2. Outliner かレベル上で、Spline Componentを持つActorを選択する
  3. Use Current Selection を押す

これで繋がります。Update Automatically がオンなら、Unrealでスプラインを動かすたびに再クックが走ります。

補足: 内部で何をやっているか

サブネットの入力にUnrealのSplineが送られる内部実装についてですが、Opusに調査させた感じだとポイントを送っているわけではなく、

Unreal側が「Houdiniの中にCurve SOPを建てて、それをHDAの入力コネクタに繋ぐ」という操作をリモートでやっているらしいです。

  1. 入力の数HAPI_AssetInfo.geoInputCount をそのまま使う(BuildAllInputs())。SOPアセットならサブネットの入力コネクタの数そのもの。名前は HAPI_GetNodeInputName() で取得していて、これが上のデフォルト判定に使われます。
  2. スプラインの変換FUnrealSplineTranslator::CreateInputNodeForSplineComponent()GetLocationAtDistanceAlongSpline() でローカル空間の位置をサンプリングし、Houdini側に Curve SOPを1個作って coords パラメータに座標文字列を流し込む。その後 rot / scale を点属性として追加します。
  3. 接続HAPI_ConnectNodeInput(アセットのノードID, 入力インデックス, 作ったカーブのノードID, 0)

点数は ceil(スプライン長 / Unreal Spline Resolution) + 1 で、Resolutionのデフォルトは50。つまりUnreal上で50cmごとに1点です。0 にすると制御点だけが送られます。

参考