On this page

上流 に(つまりUnityからHoudiniに)データを送ることができるのは、非常に便利で強力な機能です。 これにより、UnityのデータをHoudiniアセットの入力として使用し、そのアセットをクックして生成された出力をUnityに戻すことができます。

これは2通りの方法で行なうことができます:

入力データを送信して使用する主な仕組みは、 Object Merge ノードを介したものとなっています。 既存のObject Mergeノードを使用するか、または、新しいノードを作成して、それをアセットに接続します。

現在のところ、以下の入力データが対応しています :

以下の入力データが今後対応される予定です :

ノード入力

設計上、SOPにはジオメトリを渡すためのノードコネクタがあります。 このため、SOPタイプのアセットには、ジオメトリを入力するためのノードコネクタを含めることもできます。 入力は、アセットの Operator Type Properties ダイアログでMinimum InputsおよびMaximum Inputsの値を変更することで構成することができます。

このようにして作成されたすべての入力は、入力インターフェースにリストされます。 これらはオブジェクトパス入力パラメータと同じように扱われます。

オブジェクトパス入力パラメータ

オブジェクトパス入力は、Houdiniノードのパスを受け入れる Operator Path パラメータから作成されます。 ジオメトリを入力するには、 Op FilterAny Object または Any SOP に設定する必要があります。 ジオメトリがこのパラメータに割り当てられると、Houdini Engineはその入力ジオメトリを表現した適切なHoudiniノードを作成します。 アセットはそのノードを使用してそのジオメトリにアクセスします。

オブジェクトパス入力は、 Objectタイプ アセットと SOPタイプ アセットのどちらにもジオメトリ入力に使用することができますが、SOPタイプアセットではノード入力接続を直接使用する方が一般的です。

Operator Path は手動で作成することもできますが、最も簡単な作成方法は、 Object Merge SOPを作成し、その Object (objpath) パラメータをアセットレベルに露出させることです。 その後、Object Merge SOPの出力からジオメトリにアクセスすることができます。 Unityでは、アセットUIの入力インターフェースとして表示されます:

HDA Input Type

Input Type

入力データのタイプです。2種類の入力タイプがあります:

UNITY_MESH入力タイプにはGameObjectまたはPrefabのタイプがあり、 HDA(入力アセット)はHEU_HoudiniAssetRootコンポーネントが追加されているオブジェクトを参照します。 上記の画像は、それらのタイプの入力インターフェースです。

Keep World Transform

これは、入力オブジェクトのトランスフォームがUnityからHoudiniにマーシャリング(等価変換)される方法に影響を与えます。 ジオメトリが入力を介してHoudiniにマーシャリングされる場合、 Object Merge ノードを使用してアセットとジオメトリが接続されます。 ノード入力では、その Object Merge ノードはHoudini Engineによって自動的に作成され、オブジェクトパス入力のObject Mergeと同じようにセットアップされます。

  • Keep World Transform がオンの場合、入力の接続に使用される Object Merge のTransformタイプパラメータは Into This Object に設定され、入力ジオメトリはUnityのワールドトランスフォーム値をHoudiniで使用するようになります。 そのため、入力がUnityで(0,10,0)だった場合、Houdiniでも(0,10,0)になります。

  • オフの場合、 Object Merge のTransformタイプパラメータは None に設定され、ジオメトリはUnityのトランスフォームをオブジェクトトランスフォームからのオフセットとして使用するようになります。 そのため、入力が(0,10,0)だった場合、Houdiniではオブジェクトトランスフォームから10ユニット分高くなります。

Note

HDA自身のObject MergeノードのTransformタイプパラメータを設定することで、この動作をさらに変更することができます。 基本的に、この設定はローカル(HDAのトランスフォーム)またはワールドトランスフォームを入力オブジェクトに使用します。 以下のテーブルには、その可能な組み合わせを載せています。

HDAのObject MergeのTransformタイプ

Keep World Transform

入力トランスフォームの結果

None

オフ

HDAトランスフォームを使用(HDAの位置)

None

オン

HDAのトランスフォーム + 入力のオフセットを使用

Into This Object

オフ

単位行列トランスフォーム(ワールド原点)

Input This Object

オン

入力のトランスフォームを使用(入力のワールド位置)

ほとんどの場合、最初の行(HDAの位置)または最後の行(入力の位置)で、入力ジオメトリの位置が望ましい結果になります。

Pack Geometry Before Merging

入力オブジェクトでのみ利用可能です。

オンの場合、すべての異なるUnityメッシュは、アセットの入力にマージされる前に個別にパックされます。 これによってHoudiniで各オブジェクトをパックプリミティブとして利用可能になり、オブジェクトのインスタンス化や区別が容易になります。

入力オブジェクト

入力オブジェクトのタイプ: Unityメッシュ、地形、境界ボックス、タイルマップ

他のすべての入力オブジェクトは、UNITY_MESHオプションの特殊なケースとして扱われます。 つまり、入力タイプがUNITY_MESHに設定されていると、それが地形オブジェクトとして識別された場合、デフォルトオプションでTerrainデータをマーシャリングします。

実メッシュコンポーネントが必要な場合、入力はUnity Meshデータ(具体的には、有効なメッシュジオメトリを含むMeshFilterコンポーネント)を含む(GameObjectまたはPrefab)である必要があります。 ジオメトリをマーシャリングする際、GameObjectの名前が_unity_input_mesh_name_Primitiveアトリビュートに割り当てられます。 HoudiniでこのPrimitiveアトリビュートを使用してそのメッシュを区分けすることができます。 GameObjectにマテリアルが割り当てられている場合、そのマテリアル名も_unity_material_Primitiveアトリビュートに設定されます。 こうすることで、Unityに戻す(双方向変換)場合でもマテリアルの割り当てを維持することができます。

その他のオプションでは、その特定のタイプのObjectフィルターで入力オブジェクトを選択することができ、その特定のタイプには追加オプションを含めることができます。

Transform Offset - Keep World Transform が有効な場合、各入力オブジェクトには、入力オブジェクトのワールドトランスフォームに加算するトランスフォームオフセットを割り当てることができます。

また、HEU_BoundingVolumeコンポーネントが追加されたオブジェクトを追加すると、その境界ボックス内のすべてのメッシュが入力として使用されます。 これには、コライダーの境界ボックスを使って単純に比較するUnityのcollider.bounds.Intersects()が使用されます。

タイルマップ入力オブジェクトは、各タイルを表現したポイントデータとしてHoudini Engineに設定することができます。 ポイントには、PointアトリビュートのP (位置)、Cd (タイルのカラー)、orient (タイルマップの回転)、scale (タイルマップのスケール)、unity_tile_pos (グリッド内の位置)、unity_tile_size (タイルのサイズ)、およびDetailアトリビュートのunity_tile_bounds (グリッドのサイズ)があります。 また、タイルマップ入力オブジェクトには、これらのアトリビュートを有効化/無効化/変更するためのオプションもたくさん含まれています。 例えば、 Create Groups for Tiles は、タイルタイプ毎にポイントグループを自動的に作成したり、タイル名を示したunity_tile_name文字列Pointアトリビュートを出力します。

入力アセット

入力アセットのタイプ: HDA、カーブ

他のすべての入力アセットは、HDAオプションの特殊なケースとして扱われます。 つまり、入力タイプがHDAに設定されていると、それがカーブオブジェクトとして識別された場合、デフォルトオプションでHDAデータをマーシャリングます。

HDA入力タイプでは、これを使用してUnityシーン内に複数のHDAを指定することができます。 ここでは、HDAのルートGameObject(Houdini Engine UIを持つもの)のみが受け入れられます。 設定すると、プラグインはHoudini Engineセッションに新しい Object Merge ノードを作成し、 Object (objpath) パラメータでHDAへのパスを指定して、新しい Object Merge ノードを現在のアセットに接続します。 この方法ではHoudini Engineセッション内で直接接続が行なわれるため、アセットで作成されたジオメトリを別のアセットにアップロードするよりも効率的です。

Inspectorのロック

Inspectorをロックして、階層からオブジェクトを選択できるようにします。 このためには、 Select from Hierarchy ボタンを押して階層からオブジェクトを選択してから、 Use Current Selection ボタンを押してInspectorをロック解除し、選択したGameObjectを入力として使用します。

カスタム入力スクリプト

カスタムスクリプトはプラグインの入力メカニズムに簡単に追加でき、カスタム入力データのアップロードをサポートしたり、ビルトインのスクリプトを上書きすることができます。 例えば、ビルトインのスクリプトを使用する代わりに、メッシュや地形をアップロードするための独自の入力スクリプトを追加することができます。

HEU_InputUtility.csは、HEU_InputInterface.csから派生した入力インターフェーススクリプトを管理するユーティリティクラスです。 HEU_InputInterfaceから派生したクラスは、自身をHEU_InputUtilityに登録します。 入力オブジェクトをHoudiniにアップロードする必要がある場合、HEU_InputUtilityは、ユーザが設定した優先順位に基づいて、そのオブジェクトをアップロードすることができる登録済みのHEU_InputInterfaceを検索して使用します。

HEU_InputInterfaceMesh.csHEU_InputInterfaceTerrain.csはそれぞれ、メッシュと地形オブジェクトのアップロードを処理するHEU_InputInterface派生クラスのサンプルです。

カスタム入力スクリプトフックを追加するには、HEU_InputInterfaceから派生した新しいクラスを作成し、必要なメソッドを指定した後、HEU_InputInterfaceMesh.csからOnScriptsReloaded関数をコピーして編集し、[InitializeOnLoadMethod]および[UnityEditor.Callbacks.DidReloadScripts]アトリビュートを追加します。 これらのアトリビュートはOnScriptsReloaded関数を呼び出し、自動的に新しいカスタムインターフェースオブジェクトを作成します。 そして、Unity Editorスクリプトがリロードされるときに、それをHEU_InputUtilityに登録します。

Unity

はじめよう

プロジェクトのセットアップ

Houdini Engineを使用する

リファレンス