🐯

[Houdini][Tips] Attributeのmetadataの種類によってTransformのかかり方が変わるので意識しておこう

2025/02/09に公開

結構重要だと思うのですが、勉強した入門書籍や教材動画には言及がなかった(と思う)のでメモしておきます。

Attributeのmetadataについて

↓のように、node infoでAttributeを見ると、変数名・型名の右に [Vec],[Norm],[UV],[Pos] などの記号が付いているものがあります。(無いものもあります。)
↓の例では、型名はすべて「3 Flt」で同じですが、記号はすべて異なっています。

この記号は「Attribute type metadata」というものです。
↓の公式ページに書いてあるとおりなのですが、このmetadataの種類によって、そのAttributeへのTransformのかかり方が変わります
https://www.sidefx.com/ja/docs/houdini/vex/attribtypeinfo_suite.html

Transformのかかり具合の検証

このTransformのかかり具合というのを少し試してみます。

↓のように「MyDir」と「MyPos」の2つのAttributeがあります。2つとも「3 Flt」ですが、metadataは異なり、前者は「vector」で、後者は「none」です。

よく見ると、「MyDir」のほうは要素が[x][y][z]になっていて、「MyPos」のほうは[0][1][2]になっていて、ここでも違いが見て取れます。

Transform適用前

ここで、↓のように「Transform」ノードによって、RotateとScaleをかけてみると、metadataが「vector」である「MyDir」のほうは値が変わり、metadataが「none」である「MyPos」のほうは値が変わりませんでした
また、「Transform」ノードのTranslateを与えても、どちらのAttributeも値は変わりませんでした
Transform適用後

metadataの設定&変更の仕方

予約語の「P」「N」「uv」などはあらかじめmetadataが付いているようです。
では、自分で作成したAttributeにはどうやってmetadataを付けるのでしょうか?

「Attribute Create」ノードで付ける

Attributeの作成を「Attribute Create」ノードで行う場合は、「Type」を「Float」にするとmetadataは「none」に、「Type」を「Vector」にするとmetadataは「vector」になるようでした。

しかし、ここでは「Type」を「Vector」にする以外に、metadataを付けることは出来ないようでした。

Wrangleで「setattribtypeinfo」で付ける

こちらの方法であれば、比較的自由にmetadataを設定&変更できるようです。
↓では例として、「MyDir」のmetadataを「point」に、「MyPos」のmetadataを「normal」に変えてみました。

ただ、ちょっと面倒なのが、VEXでAttributeを作成するときに、ひと息でmetadataまで設定できない、ということです。
例えば、「Hoge」という「3 Flt」を作成するときは↓のように書きますが、metagataまでは指定できないので、デフォルトでは「none」になってしまっています。
metadataはデフォルトの「none」になっている

これを「vector」にしたい場合は、2行目で「setattribtypeinfo」をしてあげる必要があります。
setattribtypeinfoによってmetadataが「vector」に変わった

これはとても面倒ですね。いちいち所属Classも書かないといけないし、変数宣言時に変数名を2回書かされる、というのも面倒です。

何とかひと息で書ける方法がないのかなと、↓の公式ページを見てみたのですが、25/02/09現在では、そのようなシンタックスは存在しないようでした。
https://www.sidefx.com/ja/docs/houdini/vex/snippets.html

今後、もっと楽に書けるようにアップデートされるとうれしいですね。

Discussion