Houdini 21.0 Unreal

インスタンサー

On this page

入力

インスタンス化されたStatic Meshコンポーネントを含むアクターを選択すると、Houdiniにインスタンサーをインポートすることができます。 インスタンス化されたメッシュは、パックプリミティブとしてインポートされ、インスタンス化されたポイントにそれぞれコピーされます。

インスタンスに使用される各マテリアルには、それに呼応したunreal_materialINDEXというアトリビュートがあります。 INDEXはそれ呼応するマテリアルのスロットのインデックスです。値は、そのマテリアルへのUnrealパスになります。

フォリッジインスタンスも同じようにインポートすることができ、unreal_foliage attributeセットが含まれます。

または、 Import as reference チェックボックスをオンにすると、スタティックメッシュを単一のアトリビュートインスタンスとしてインポートすることもできます。

出力

プラグインは、パックプリミティブ、オブジェクトインスタンサー、アトリビュートインスタンサーを使用して、アセットからインスタンスを出力することをサポートしています。

Unrealのインスタンス化されたジオメトリは、デフォルトではInstancedStaticMeshComponents(デフォルト)、インスタンス化されたジオメトリに複数のLODがある場合はHierarchicalInstancedStaticMeshComponentsです。 LODがない場合であっても強制的にHierarchicalInstancedStaticMeshComponentsを作成したい場合は、unreal_hierarchical_instancerを追加して、値を1に設定します。

Note

Naniteメッシュでは、HierarchicalInstancedStaticMeshComponentsの使用を強制することはパフォーマンスが悪くなるため、推奨されていません。

インスタンス化されたジオメトリまたはuassetsは、Detailsパネルの Houdini Outputs セクションに、以下のようにインスタンサーとして表示されます。

Pointアトリビュートを追加して、インスタンス化されたメッシュにマテリアルオーバーライドを指定することができます。 unreal_materialINDEXという名前のアトリビュートを作成します。 INDEXは、上書きするマテリアルスロットインデックスを表します。値は、使用されるマテリアルへのUnrealパスにする必要があります。

Note

Unrealでのインスタンス出力のジオメトリ置換は、Houdini20.5で廃止され、Houdini21.0で削除されました。 代わりに、アトリビュートインスタンサーを使用してください。

パックプリミティブ

推奨されるインスタンスの作成方法は、パックプリミティブを使用することです。 パックジオメトリがインスタンス化されたジオメトリとして使用され、このパックプリミティブのすべてのコピーがUnrealでインスタンスに変換されます。

Note

パックプリミティブにインスタンサーが作成されるのは、パックプリミティブが複数回コピーされる場合のみです。 単一インスタンスのインスタンサーでは、通常のStatic Meshコンポーネントのみ作成されます。 これは、unreal_force_instancerアトリビュートを使用することで変更することができます。

簡単なのは、 Copy To Points SOPPack and Instance オプションをオンにして使用することです。 入力にPack Geometry Before Mergingを使用しても構いません。

インスタンサーまたはパックプリミティブのインスタンス化されたメッシュのいずれかのプロパティを制御する際に重要なのは、アトリビュートの位置を考えることです。 パック前にアトリビュートを適用すると、生成されたメッシュに適用されます。 例えば、PACK SOPを使用する前にアトリビュートを適用する場合です。パック後にアトリビュートを適用すると、インスタンサーのみに適用されます。

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

HDAで生成されたジオメトリのインスタンス化に加えて、インスタンスは既存のUnrealアセットから作成することもできます。

これ実行するには、unreal_instanceアトリビュートを使用し、そのアトリビュート値をアセットの参照に設定します。

スタティックメッシュに限らず、インスタンス化されるアセットはネイティブのアクターのタイプに変換可能でなければなりません。 その場合、そのアクターのタイプの複数のインスタンスが作成され、生成されたインスタンサーコンポーネントはHoudiniInstancedActorComponentになります。 これは、生成されたインスタンサーのポイントクラウドを使用して、そのレベルの既存のアセットを生成するのに使用することができます。

また、アトリビュートインスタンサーを使用して、クラスを直接インスタンス化することもできます。 これは、コンテンツブラウザにUassetとして保存することはできないが、アクター(例えばLight、Volumeなど)としてインスタンス化できるクラスのインスタンスを作成するのに便利です。

そのためには、unreal_instanceボリュームを、アクターとしてインスタンス化したいクラスの名前に設定します(unreal_instance = PointLight)。

Note

正しく検出するためには、アトリビュートインスタンサーがジオメトリの別の部分にある必要があります。 アトリビュートインスタンサーが割り当てられているポイントがメインジオメトリの一部である場合、アトリビュートインスタンサーは検出されません。

アトリビュートインスタンサーが参照するアセットが見つからない時には、プラグインはインスタンサーを無視するのではなく、デフォルトの“asset not found”ボックスメッシュ(デフォルトでゲーム内で非表示)を作成します。 これを有効または無効にするには、プラグイン設定の Show default Mesh チェックボックスを使用します。

Houdini rot/orientおよびscaleアトリビュートを適用して、インスタンスのトランスフォームを指定することができます。

インスタンサーの分割

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

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

例えば、unreal_split_attrアトリビュートにunreal_materialアトリビュートを使用すると(unreal_split_attr = unreal_material)、2つ目のアトリビュートの各マテリアルについて、インスタンサーコンポーネントが作成されます。 3つの異なるマテリアルが使用されていれば、インスタンサーは3つの異なるインスタンサーコンポーネントに分割されます。

Houdini20.5では、unreal_split_instancesアトリビュートを使用して個別のStaticMeshComponentsを作成する方法が廃止され、今後のバージョンで削除されます。 代わりにunreal_split_attrアトリビュートを使用することを推奨します。

以下のコードは、unreal_split_instancesアトリビュートと同様の挙動にすることができます:

i@id = @ptnum;
s@unreal_split_attr = "id";

インスタンス毎のカスタムデータ

インスタンス毎のカスタムデータを使用すると、カスタムデータをインスタンスバッファに追加して、その後、インスタンサーのマテリアルの頂点シェーダによって読み込むことができます。

HDAでは、インスタンスにおけるインスタンス毎のカスタムデータを、アトリビュートを通して指定することができます:

インスタンス毎のカスタム浮動小数点の数は、unreal_num_custom_floatsアトリビュートを介して設定できます。 カスタムデータ自体は、unreal_per_instance_custom_dataXアトリビュートを介してインスタンスで設定できます(Xは、カスタム浮動小数点データのゼロベースのインデックス)。

例として、インスタンスにカスタムRGB float値を指定することができます。

以下を追加する必要があります:

i@unreal_num_custom_floats = 3;   (各インスタンスが3つのカスタム浮動小数点を持つことを示すために)
f@unreal_per_instance_custom_data0 = XXX; (赤の値)
f@unreal_per_instance_custom_data1 = YYY; (緑の値)
f@unreal_per_instance_custom_data2 = ZZZ; (青の値)  

フォリッジタイプ

HDAを使用してフォリッジインスタンスを出力するには、値を1に設定したunreal_foliageアトリビュートをインスタンスに追加してください。 UE5ではUnrealレベル内にフォリッジインスタンスを作成するには、コンテンツフォルダに格納されたフォリッジタイプアセットが必要です。

HDAのインスタンスタイプがUnrealスタティックメッシュを参照するように設定されている場合、プラグインはクック時およびベイク時に、必要なフォリッジタイプアセットを自動的に作成します。

インスタンスタイプが既存のUnreal フォリッジ Type に設定されている場合、フォリッジインスタンスはそのフォリッジタイプにベイクできます。 クック中、一時的なフォリッジタイプが作成されます(これは、HDAで指定されたユーザ定義のフォリッジタイプのコピーです)。 これにより、クック後に、フォリッジエディタで既存のフォリッジまたはHDA生成のフォリッジのいずれかを選択することができます。 ベイク時のみ、インスタンスはターゲットのフォリッジタイプを使用してレベルにベイクされます。

Note

一時的なフォリッジタイプを変更すると、HDAをベイクした時に新しいフォリッジタイプが作成されます。 これによって、元のフォリッジタイプが変更されなくなります。

unreal_foliage_attachment_typeアトリビュートは、Unrealレベル内でフォリッジインスタンスを別のオブジェクトにアタッチします。以下の値を使用できます:

  • 0 - インスタンスはアタッチされません(デフォルト)。

  • 1 - インスタンスはすべてのコリジョンコンポーネントにアタッチすることができます。

  • 2 - インスタンスはランドスケープコリジョンコンポーネントにのみアタッチすることができます。

アタッチする正確なコンポーネントは、unreal_foliage_attachment_distanceの距離だけ、インスタンスの位置の上方から上下に垂直にレイトレーシングすることで決定されます。

レベルのインスタンス化

レベルのインスタンス化はUnreal5.1以降でサポートされており、ソースレベルまたはPacked Levelブループリントを参照するようにunreal_instanceを設定します。

Unrealでは、レベルのインスタンス化はコンポーネントレベルではなく、アクターレベルで実行されます。 そのため、クックおよびベイクの両方で、コンポーネントではなくアクターが生成されます。

Note

Unrealでは、ソースレベルとターゲットレベルの両方で、External Actorsなどの特定の設定が有効になっている必要があります。 HDAやインスタンス化パイプラインを開発する際は、Unrealでマップチェックを実行して、データと最新バージョンのUnrealとの間に互換性があることを確認することをお勧めします。

アトリビュート

Houdini to Unreal

このテーブルには、HDA内で設定する特殊なアトリビュートを載せており、このプラグインは、HoudiniデータをUnreal出力に変換する時にそれらのアトリビュートを認識します。 アセット上にこれらのアトリビュートをセットアップすることで、生成されるUnreal出力の一部のプロパティと挙動を制御およびオーバーライドすることができます。 詳細は、アトリビュートとグループを参照してください。

インスタンサー

アトリビュート名

オーナー

説明

unreal_instance

Point, Detail

string

指定したトランスフォームでインスタンス化されるアセットのUnrealパス。バージョン2では、このアトリビュートはクラス名にもなります(PointLightなど)。

unreal_foliage

Detail, Primitive, Point

int, float

インスタンスで使用(および1に設定)されるとき、プラグインは、新しいアクター/コンポーネントを作成する代わりに、現行レベルのFoliageシステムにインスタンスを追加します。

unreal_foliage_attachment_type

Point

int

フォリッジをそのレベルの他のオブジェクトに追加すべきかどうかを決定します。Yesなら1、Noなら0、ランドスケープのみに追加する場合は2です。

unreal_foliage_attachment_distance

Point

float

unreal_foliage_attachment_typeの使用時に、垂直に検索する距離。デフォルトは1000です。

unreal_split_attr

any

string

2つ目のアトリビュート値に基づいてインスタンサーを複数のコンポーネントに分割するために使用される、もう1つのアトリビュートの名前を示します。

unreal_hierarchical_instancer

any

int

1に設定すると、InstancedStaticMeshComponentsではなくHierarchicalInstancedStaticMeshComponentの作成を強制できます。 またこれは、インスタンス数がわずか1の場合でも、HierarchicalInstancedStaticMeshComponentの作成を強制することができます。

unreal_force_instancer

any

int

1に設定すると、スタティックメッシュにインスタンスが1つしかない場合でも、インスタンサーコンポーネント(InstancedStaticMeshComponentまたはHierarchicalInstancedStaticMeshComponent、後者はLODまたはunreal_hierarichal_instancer == 1に基づいています)の作成を強制することができます。

unreal_num_custom_floats

any

int

インスタンサーのインスタンス毎のカスタムデータに使用される、カスタム浮動小数点の数を示します。

unreal_per_instance_custom_dataX

any

float

インスタンス毎のカスタム浮動小数点データ(Xはカスタムデータのゼロベースのインデックス)

unreal_instance_origin

point, detail

float(3)

メッシュインスタンスの場合、インスタンサーコンポーネントの原点からの相対位置。 これは、Houdini座標で指定します。 これは、Unreal座標に変換され、Houdini Asset Componentを基準とした相対位置になります。

インスタンサー上にカスタムプリミティブデータを設定することもできます。 ただし、これらのアトリビュートは、個々のインスタンスではなくて、インスタンスコンポーネント自体に適用されることに注意してください。 そのため、パックプリミティブインスタンサーを使用する場合、カスタムプリミティブデータアトリビュートは、パックノード前ではなくてパックノード に設定してください。

カスタムプリミティブデータ

アトリビュート名

オーナー

説明

unreal_num_custom_primitive_data

any

int

出力コンポーネントのカスタムプリミティブデータに使用される浮動小数点カスタムプリミティブデータの数を示します。

unreal_custom_primitive_dataX

any

float

浮動小数点カスタムプリミティブデータ(Xはカスタムプリミティブデータの0から始まるインデックスです)。

Unreal

はじめよう

基本

Houdini Engineを使用する

スクリプト

リファレンス