Houdini 20.0 Unity

インスタンス化

On this page

プラグインは、生成されたジオメトリや既存のジオメトリを簡単にインスタンス化することができます。

3つのタイプのインスタンス化がサポートされています:

(HDAによって)生成されたジオメトリをインスタンス化したい場合は、パックプリミティブを使用することをお勧めします。 既存のUnityジオメトリ(Prefab)のインスタンスを使用したい場合は、ポイントクラウドのインスタンス化を使用することをお勧めします。

以下に示すのは、Unityでインスタンス化されたキューブです:

パックプリミティブ

パックプリミティブは、実質的にはSOPの内部に存在するプリミティブで、独自のトランスフォームを持った1つ以上のプリミティブを含んでいます。 パックプリミティブは、他のパックプリミティブを含むことができるため、完全にSOPの内部にフルトランスフォーム階層を持つことができます。 パックプリミティブを使用する利点は、すべてのインスタンスの代わりに、ジオメトリのコピーが1つだけメモリに格納されることです。

Unityでは、パックプリミティブ出力(GameObject)は、そのメッシュデータがインスタンス毎にコピーされるのではなく、共有されるようにインスタンス化されます。 また、生成されたマテリアルに対して GPU Instancing が自動的に有効になるので、バッチレンダリングが可能になります。

このメソッドを使用する単純な方法は、 Pack and Instance オプションを有効にした状態で Copy To Points SOPを使用することです。 また、入力にPacked Geometry before Mergingを使用しても構いません。

オブジェクトインスタンサー

インスタンサーは、 Instance Objectノードを使用して作成することも可能です。 これも有効なインスタンス化の方法ですが、生成された出力のインスタンス化にはパックプリミティブを使用することをお勧めします。

上記の図が示しているのは、オブジェクトインスタンサーの入力フィールドです。 複数のオブジェクトが指定された場合、それらは単一のオブジェクトとして扱われてインスタンス化されます。

アトリビュートインスタンサー

HDA内のオブジェクトは、Instance Objectノードの特別な インスタンス Pointアトリビュートを使用してインスタンス化することができます。

ポイントクラウドのインスタンス化

HDAを通して既存のUnity Prefabまたはアセット(FBXモデルなど)をインスタンス化する最も単純な方法は、ジオメトリのポイントのみを生成し(つまりプリミティブは生成しません)、特別な unity_instance アトリビュートを使用することです。 このunity_instanceアトリビュートは、Point文字列アトリビュートまたはDetail文字列アトリビュートのどちらかで指定し、インスタンス化するアセットのUnityプロジェクト内のパスを含めてください。

パスは、プロジェクトのAssetsフォルダを基準とした相対パスでなければなりません(例えば、“Assets/Prefabs/Hero.prefab”)。 Prefabアセットは、Assets/フォルダからロードするよりも、Resources/フォルダからロードする方が高速であることに注意してください。 Resources/フォルダに配置されたアセットは、Assets/からの相対パス、Resources/、または拡張子なしのファイル名で指定することができます。

Resources/フォルダに配置されたアセットでサポートされるパスの例:

  • Assets/Resources/cube.prefab

  • Resources/cube.prefab

  • cube

さらに、 collision_geo 文字列アトリビュートを使用することで、インスタンス毎にMeshColliderを設定することができます。 このアトリビュート値は、Assets/ディレクトリ内のUnityメッシュアセットを指す必要があります。 インスタンスオブジェクトに既存のコライダーがある場合、それは置換されます。

インスタンスの向きを指定するには、 orient アトリビュートを使用することをお勧めします。 適切な向きにするために N アトリビュートも削除する必要がある場合があります。

インスタンス入力の上書き

Object Path Input Parameterを露出させることで、入力を介してインスタンス化されているジオメトリを上書きすることができます。

アトリビュートインスタンサーの場合、1つ以上のGameObjectが入力リストに追加されると、それらはランダムにインスタンス化に使用されます。 これにより、自動的にインスタンスにバリエーションが加わります。

インスタンス名

インスタンス化するGgameObjectの名前は、デフォルトでは _ジオメトリ名_Instanceインデックス_ のように変換されます。 このため、“Cube”という名前のジオメトリノードの2番目のインスタンスは“Cube_Instance2”のようになります。 この動作を上書きするには、 instance_prefix という文字列アトリビュートを使用して、名前の接頭辞の部分を設定します。 この場合、ジオメトリノード名の“Cube”をinstance_prefixアトリビュートの値で置き換えることになります。 このアトリビュートは、DetailアトリビュートまたはPointアトリビュートのどちらかである必要があります。

Detailアトリビュートによる単一のインスタンス接頭辞

Detailアトリビュートを使用してインスタンスの接頭辞を設定すると、すべてのインスタンスに同じ接頭辞が追加されます。

Pointアトリビュートによる複数のインスタンス接頭辞

Pointアトリビュートを使用すると、それぞれのインスタンス名の接頭辞を個別に設定することができます。

インスタンサーを分割する

インスタンサーの出力を複数のコンポーネントに分割したい場合もあるでしょう。 その理由としては、インスタンサー毎に異なるマテリアルを割り当てたり、ベイク時に生成されるアクターをより細かく制御したいなどが挙げられます。

これを実現するには、unity_split_attr文字列アトリビュートを使用します。 このアトリビュートの値は、別のアトリビュートの名前に設定する必要があり、その値を使用して分割を制御します(そのアトリビュートの個々の値毎に個別のインスタンサーコンポーネントが作成されます)。

以下に、unity_materialアトリビュートに基づいてインスタンサーを分割するHDAの例を示します:

Unity

はじめよう

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

Houdini Engineを使用する

リファレンス