Houdini Engine For Unity触ったことがなかったので
記事やチュートリアル参考に何ができるのかざっくり試してみました。
はじめに
- まず前提としてHoudini Engineを利用する場合は、Houdini Indie以上が必要なようです。
- UnityEditor上で動作します。一応プレイ中でもビルドはできました。
- とりあえず導入のとっかかりとしてはUnity道場のこちらの動画が参考になるかと思います。基本的にはHoudiniでHDA作成してUnityプロジェクトに配置してhierarchyにドラッグで準備完了です。
- ちなみにsteam版の場合、HoudiniEngineのUnityパッケージは以下にありました。
Steamインストールフォルダ\steamapps\common\Houdini Indie\engine\unity\
- 環境
- Houdini Indie 19.0.455
- Unity 2021.2.3f1
メッシュ加工
Houdiniネットワーク
ついでにScriptをAttributeでアタッチ指定 ### Unity実行結果
合わせてScriptのアタッチも試しましたが、ちゃんとアタッチされてていてメッセージも送られてました。(公式ドキュメント)
[ExecuteInEditMode]
public class HoudiniAttacheScript : MonoBehaviour
{
void Msg(string text)
{
Debug.Log(text);
}
}
GroupごとにアタッチするScriptを付け替える等活用できそうな気がします。
カーブに沿ってMeshを作成・配置
Unity側でカーブを作成して、Houdiniに渡す。
内容的には真ん中のモデルをCurve上に均等に並べるだけです。
Unity
### 実行結果 ちなみにPackしているのでインスタンスもちゃんと分かれてます ![curve_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179625/1277c231-0ab6-e082-5cdd-d8d53b84cae5.png) 無事動作しましたが、カーブを編集してもリアルタイムに反映されなかったり、カーブ周りは色々不具合があるのかなという印象でした。(Rebuildするとちゃんと動く)Photoshop連携
GDC2019の動画を見かけて、やってみたかったので。
赤色がスポーン位置用レイヤー、橙色が道エリア用レイヤー、その他のエリアには木を生やすみたいな想定です。
Photoshopのレイヤーごとにグループ化してTraceしてくれました。
Houdiniネットワーク
### Unity PSDファイルはUnity側からパスを渡してます。 ![photoshop_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179625/dab5b49c-5fa0-25ea-d5ca-8e791fce38a8.png) Unity側のモデルを渡し、UnityマテリアルもアタッチするようAttributeを設定してます。 ![photoshop_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179625/0e192ddc-535c-2ebd-022c-d04bcfdddaa9.png)SDF出力チャレンジ
メッシュ以外に書き出しできないかと、割と強引?にHoudiniでSDFを出力してUnityに取り込んでレイマーチングしてみました。
SDFのレンダリングは凹みさんのuRaymarchingを使用させていただいてます。
Houdiniネットワーク
Houdini側は最終的に「Volume Exporter」ノードを介すことでSDFファイル出力まで一貫して処理できました。
また、なにも考えずHoudiniでSDF変換したためかメッシュによってボリュームの解像度が異なります。
なのでUnityでサイズを受け取り、Texture3Dに変換します。
Houdini側の準備としてボリューム解像度をAttributeに変換して、Unity側に返すよう設定します。
WrangleでAttribute化
Unityに渡すAttribute設定(公式ドキュメント)
Unity
Unity側は書き出し先の指定とRebuildのイベントを受け取りSDF(TGA)をTexture3Dに変換。
Rebuild完了イベントをUnityでキャッチして設定値を取得、Texture3Dに変換できれば完了なはずです。
public void OnRebuilded(HEU_ReloadEventData data)
{
foreach(var o in data.OutputObjects)
{
var store = o.GetComponent<HEU_OutputAttributesStore>();
if (store != null)
{
var volumeresAtt = store.GetAttribute("volumeres");
var volumeres = volumeresAtt._floatValues;
var tex = TGALoader.LoadSDFTGA(srcPath, volumeres [0], volumeres [1], volumeres [2]);
AssetDatabase.CreateAsset(tex, destPath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
}
}
実行結果
Houdiniから値がセットされていることを確認できます。上記のスクリプトで受け取りTexture3D生成処理に自動で渡ってます。SDFのTGA→Texture3Dの変換方法が見つからなかったので地味に苦労しました。
こちらを参考に作成してみました。
TGALoader.LoadSDFTGA()
結果的にできるはできたのですが、モデルによってはうまく出力されなかったり、
Objectを出力してないので「Unable to generate terrain due to lack of heightfield layers!」と怒られたり
Raymarching側でさらに調整したりと、まあうまくはいかなかったかなと。
(諸々理解不足だったことも大いにありますが。。)
感想
特に処理自体はHoudini単体でも実現はできるのですが、
Unityをベースにワークフローとして一定自動化できて便利そうです。
個人的には+αで、Houdini側からComponentのアタッチやパラメータの受け渡しができることもメリットかと思います。