6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Houdini Engine For Unityを色々試してみる

Last updated at Posted at 2021-12-22

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に加工してもらう

Houdiniネットワーク

ついでにScriptをAttributeでアタッチ指定 ### Unity

実行結果

合わせてScriptのアタッチも試しましたが、ちゃんとアタッチされてていてメッセージも送られてました。(公式ドキュメント)

[ExecuteInEditMode]
public class HoudiniAttacheScript : MonoBehaviour
{
    void Msg(string text)
    {
        Debug.Log(text);
    }
}

mesh_cloud_05.png

GroupごとにアタッチするScriptを付け替える等活用できそうな気がします。

カーブに沿ってMeshを作成・配置

Unity側でカーブを作成して、Houdiniに渡す。
内容的には真ん中のモデルをCurve上に均等に並べるだけです。

ということでやってみましたが、本来Editable NodesにCurveを追加して準備完了のはず(?)だと思っていたのですが Unity側でカーブ編集のギズモが表示されなかったのでCurve Nodeは別で用意して、HDAパラメータに指定することでできました。 (HoudiniEngine → New Node → Curve) ### Houdiniネットワーク

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のアタッチやパラメータの受け渡しができることもメリットかと思います。

参考

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?