Houdini 20.0 VEX

VOPのStruct(構造体)

On this page

概要

VEXの構造体タイプ(通常は“struct”(構造体)と呼びます)は、 メンバー と呼ばれるサブデータの名前付き要素(整数、浮動小数点、ベクトル、マトリックス、他のStruct(構造体)など)で構成された複合データタイプです。

Struct(構造体)の 定義 は、テンプレートと同様にメンバーの名前、データタイプ、UIラベルを指定します。これは、ベクトルやマトリックスと同様に新しい データタイプ を定義します。そして、テンプレートの インスタンス を作成して、メンバーの値を設定します。

StructStruct PackStruct UnpackのノードによるVOPネットワーク内でStruct(構造体)を使うことができます。

Note

Houdini13では、Struct(構造体)はHoudiniで使われません。Structは複数のワイヤーを整理として束にするために主に役に立ちます。Houdiniの将来のバージョンでは、Structをもっと深く統合します。例えば、現在のところ複数のワイヤー接続で表現したランプとノイズの設定などの要素は、その代わりにStructとして表現することができます。

定義済みStructとアドホック(一時的な)Struct

Houdiniは2通りの方法でVOP内のStructを扱うことができます。

  • “定義済み”Structは、Houdiniパス内のファイルに保存され、Houdiniのどこでも利用可能です。これは、2つ以上のネットワークで再利用/利用したい、またはネットワーク間で共有したいタイプで役に立ちます。Structノードを使うことで、定義済みStructのインスタンスを作成します。

  • “アドホック”(一時的な)Structは、“on-the-fly”(実行中)で作成され、そのノードを含むネットワーク内でのみ利用可能です。これは複数のワイヤーを束にしてネットワークを単純化したい時に役に立ちます。Struct Packノードを使ってアドホックStructのインスタンスを作成します。

ノード

  • Structノードは、別々のワイヤーをStructワイヤーに束ねることができます。このノードは、 定義済みStructタイプ を指定(または作成)して、定義済みのメンバーに基づいて入力/出力を作成する必要があります。

    Structノードを使えば、Structワイヤーの 束を解除して 別々のメンバーのワイヤーにすることもできます。

  • Struct Packノードは、別々のワイヤーをStructワイヤーに束ねることができます。Structノードとは違って、このノードは、定義済みStructタイプを指定する必要がありません。そのかわりに、任意の入力ワイヤーのタイプ(とパラメータで指定した名前)を使って、 アドホック(一時的な)Structタイプ を作成します。

  • Struct Unpackノードは、 名前で 入力Structワイヤーから個々のメンバーを展開します。通常では、Structノードを使ってStructワイヤーをメンバーのワイヤーに展開します。しかし、Structノードは位置によってメンバーを抽出するのに対して、このノードは、名前とタイプによってメンバーを抽出するので、 任意のStructタイプ を受け入れるアセット/サブネットワークを記述することができます。

    入力Structに指定した名前のメンバーがあっても、そのタイプが間違えていれば、ネットワークでエラーが起きます。Houdiniでは出力のワイヤー接続が入力と同じタイプになるように明示的に必要なタイプを必ず設定しなければなりません(Houdiniは自動的に入力のStructタイプが何かに基づいて出力タイプを変更しません)。

How to

To...Do this

新しく定義したStructタイプを作成する

  1. Structノードを作成します。

  2. パラメータエディタで、 Edit をクリックします。

  3. Create New メニューを使って新しいStructを作成します。

  4. VOP Struct Type Editorを使ってメンバーを定義します。

  5. Accept をクリックします。

定義済みStructのインスタンスを作成する

  1. Structノードを作成します。

  2. パラメータエディタで、 Struct Name メニューからStructタイプを選択します。

  3. メンバーデータをその入力にワイヤー接続します。1番目の出力はStructインスタンスを含みます。

アドホックStructを作成する

  1. Struct Packノードを作成します。

  2. メンバーデータをその入力にワイヤー接続します。

  3. パラメータエディタで、メンバーに名前を付けることができます。これでワイヤー接続とデバッグをしやすくします。名前を空白にすると、Houdiniはワイヤーの名前を使います。場合によっては、あなたが求めている名前になります(例えば、入力がParameterノードであれば、デフォルト名がParameterの名前になります)。

  4. その出力はStructインスタンスを含みます。

Structから別々のワイヤーを抽出する

  1. Structノードを作成します。

  2. Structを1番目の入力にワイヤー接続します。

  3. 入力を特定の定義されたタイプにしたい場合は、パラメータエディタで、 Struct Name をそのタイプに設定します。入力がそのタイプでなかった時には、そのノードはエラーになります。

  4. 2番目以降の出力にはメンバーデータを含みます。

名前によってStructから1つ以上のメンバーを抽出する

  1. Struct Unpackノードを作成します。

  2. Structを入力にワイヤー接続します。

  3. パラメータエディタで、 Number of Members を抽出したい数に設定します。

  4. メンバー毎に、 Member n Name で名前とタイプを設定します。

    (入力Structに指定したメンバー すべて がない、または指定したタイプでない場合には、ノードはエラーになります。)

  5. その出力は抽出された値を含みます。

Structメンバーの値を設定する

  1. Structノードを作成します。

  2. Structを1番目の入力にワイヤー接続します。

  3. 新しい値を設定したいメンバーに相当する入力にワイヤー接続します。

Structメンバーの値を修正する

  1. StructStruct Unpackを使ってStructを別々のワイヤーに展開します(上記参照)。

  2. 変更したい出力を、値を修正するノードにワイヤー接続します。

  3. 2つ目のStructノードを作成して、Structを再バンドルします。“unbundler”ノードのStruct(1番目)出力を、このノードのStruct(1番目)入力にワイヤー接続します。

  4. “unbundler”ノードのメンバー出力と“rebundler”ノードのメンバー入力の間にノードを挿入して、値を変更します。

アドホックStructのタイプのワイヤーを指定して、アドホックStructのインスタンスを新しく作成する

  1. Structノードを作成します。

  2. Structを1番目の入力にワイヤー接続します。

  3. メンバーデータを入力にワイヤー接続します。1番目の出力は、Structインスタンスを含みます。

役に立つ情報

  • Structにはデフォルトのワイヤーカラーがありますが、Structを編集する時に、そのStructタイプを持つワイヤーのカラーを指定することができます。

  • “手動で”ディスクのStruct定義ファイルを編集するには、ファイルの場所とフォーマットに関する情報を載せたStructをディスクに保存する方法を参照してください。

  • VOPデジタルアセットを作成する時、定義済みStructを入力と出力タイプとして指定することができます。

  • Houdiniがパス上の定義ファイルを検索するので(上記参照)、共有ネットワークをパスに設定すれば、シェーダを記述する人が使用するSITEの範囲まで使えるStructを定義することができます。

定義タイプの保存

Houdiniのどこでも利用可能な“定義済み”のStructタイプは、JSONファイルから読み込まれます。Houdiniは、HOUDINI_VOP_DEFINITIONS_PATH環境変数で定義したパス内の*.jsonファイルを読み込みます。 デフォルトのパスは、HOUDINI_PATH/vopです。Houdiniのエディタを使って作成したStructタイプのデフォルトファイルは、$HOME/HoudiniX.Y/vop/vopdefinitions.jsonです。

Houdiniは、アセットにVopTypeDefinitionsという名前のセクションがあれば、アセットからStruct定義を読み込みます。このセクションには、ファイルと同じフォーマットでJSON文字列を記述します。

以下の例に、Structタイプ定義ファイルの基本的な構造を載せています。メンバーのconnectorColorキーとlabelはオプションです。

{
    "typeDefinitions": [
        {
            "type": "struct",
            "typeName": "StructTest",
            "connectorColor": {
                "type": "RGB",
                "data": [0.25, 0.2, 0.9]
            },
            "variables": [
                {
                    "typeName": "int",
                    "name": "a"
                },
                {
                    "typeName": "vector",
                    "name": "b",
                    "label": "Label B"
                },
                {
                    "typeName": "matrix3",
                    "name": "c"
                }
            ]
        }
    ]
}

完全なフォーマットは、$HFS/houdini/vop/TypeDefinitions.json.schemaの“JSONスキーマ”ファイルに定義されています。

独自言語

JSON設定ファイルは、VOPsに対して独自言語を定義することもできます。

言語は、その言語に属しているVOPsの特定の外観や挙動を定義します。 例えば、言語は、VOPノードの入力/出力データタイプを(varyingだけでなく)uniformデータタイプに対応させるかどうかを決めます。

JSON設定ファイルは、独自言語を定義し、その外観を指定することができます。

言語を定義しその言語に名前を付ければ、VOPオペレータレンダーマスクにその名前を設定して、そのVOPをその言語に割り当てることができるようになります。 VOPs like ParameterやConstantなどのレンダーマスクを持たないVOPsは、作成された時に親から言語を継承します。 親サブネットに対して明示的に言語を設定したいのであれば、そのサブネットを作成するシェルフツール内にHOMのhou.VopNode.setShaderLanguageName()関数を使用すると良いでしょう。 Parameter VOPノードなどに直接その関数を使用することもできます。

VEX

言語

次のステップ

リファレンス