Houdini 18.5 ジオメトリ

ジオメトリのアトリビュート

Houdiniがディテール、プリミティブ、ポイント、頂点、アトリビュートを使ってどのようにジオメトリを表現するのか説明します。

On this page

Attributes

アトリビュート とは、頂点、ポイント、プリミティブ、オブジェクト上に記録される名前を付けた値のことです。例えば、ポイントカラー、位置、UV座標、スプラインの重み(W)、法線がPointアトリビュートに記録されます。

  • Houdiniがエクスプレッションで利用可能なPointアトリビュートを設定します。例えば、ポイントのY座標(PY)に基づいてカラーを設定することが可能です。

  • 手動で設定する特定のアトリビュートで、もしそれが存在すれば、Houdiniで使われます。例えば、ダイナミクスソルバとレンダリングエンジンは、ジオメトリ上に特定のアトリビュートが存在していれば、それを使います。

  • ユーザ独自のアトリビュートを設定してノードのエクスプレッション、スクリプト、エクスポーターなどで利用することができます。

サーフェスノードにアトリビュートを作成するノードを追加して、異なるタイプのアトリビュートを設定します。また、Attribute SOPでは任意アトリビュートを設定・作成することもできます。

ノードのジオメトリに適用されているアトリビュートを確認するには、ネットワークエディタのノードのタイル上でクリックして、 Spreadsheet を選択してGeometry Spreadsheetを開きます。

パーティクルにもアトリビュートがあります。ジオメトリとパーティクルシステムが相互作用するときには、このアトリビュートは、とても重要になってきます。例えば、ジオメトリから放出されるパーティクルは、デフォルトではそのジオメトリのPointアトリビュートを引き継ぎます。Attribute Transfer POPによってサーフェスとパーティクル間でアトリビュートを転送することで面白い効果を作ることができます。

ジオメトリコンポーネント

一般的には、Attribute Createサーフェスノードを使って、VertexPointPrimitive(例:ポリゴンフェース)、Detail(ジオメトリ全体)にアトリビュートを作成・設定します。

Note

ジオメトリネットワーク内の2つ以上のノードを結合するとき、同じ名前のDetailアトリビュートが複数のノードに存在すれば、Houdiniは最初のノードの値を使います。もしアトリビュートのタイプが文字列なら、Houdiniは文字列を結合して、文字列配列にします。

アトリビュートの優先順位

同一ジオメトリ内の2つのコンポーネントが、どちらも同じ名前のアトリビュートが設定されているとき、そのアトリビュートの優先順位は、ジオメトリの中で"より低いレベル"のアトリビュートが使われます。つまり、以下の通りです:

  • Vertex アトリビュートが以下のアトリビュートを上書き

    • Point アトリビュートが以下のアトリビュートを上書き

      • Primitive アトリビュートが以下のアトリビュートを上書き

        • Detail (ジオメトリ全体)アトリビュート

アトリビュート値に基づいてノードを適用

ほとんどのサーフェスノードには、 Group フィールドがあり、そこに名前が付いたグループやパターンを入力することで、ノードを適用するコンポーネントを選択します。このフィールドでは、特別な構文を使ってアトリビュートの値からコンポーネントを選択することができます。例えば、PointノードGroup フィールドに@foo>5を入力すると、fooアトリビュート値が5よりも大きいポイントをすべて選択します。

詳細は、手動でグループを指定を参照してください。

辞書アトリビュート

Houdini18.5以降のSOPジオメトリは、辞書アトリビュートに対応しています。 この辞書アトリビュートタイプは、各エレメント(ポイント、頂点、プリミティブ/フェース、ジオメトリ全体/Detail)でキー/値のペアのセットを保存することができます。

  • 辞書アトリビュートを使用することで、ゲームエンジンデータやHoudiniがネイティブで対応していない外部ジオメトリフォーマットといった複雑な"目に見えない"エレメントデータを格納することができます。

  • Detail上の辞書アトリビュートにはジオメトリに関するメタデータを格納すると良いでしょう。

  • デバッグ用途なら、生成されたノードのパラメータ値をエレメント別に格納するのも良いでしょう。 辞書Pointアトリビュート内にポイントとワイヤーとパラメータを使ってノードを表現することで、ノードネットワークをジオメトリとして保存することさえもできてしまいます。Attribute From Parms SOPを参照してください。

( 辞書配列 アトリビュートを作成することもできます。これは、アトリビュート値が単一辞書ではなくて辞書の 配列 になっています。)

辞書のキーは文字列です。 辞書の値には、文字列、数値、配列、(入れ子化した)辞書を設定することができます。 辞書アトリビュートは実質的にJSONと同じデータモデルを持ちます 。 実際に、Geometry SpreadsheetなどのUIは、辞書アトリビュートの内容をJSONエンコード文字列のように表示します。

現在のところ、辞書アトリビュートは主にPython、VEX、VOPsでサポートされています。 Attribute WrangleでVEXスニペットを使用するか、または、Python SOPを使用することでジオメトリ上の辞書アトリビュートを操作することができます。 他にも、パラメータエクスプレッションでキー値を読み込む簡単なサポートもあります。

言語

対応

VEX/VOPs

  • アトリビュート値を読み込む標準VEX関数を使用することで、辞書全体をVEXのdict型として取得することができます。

  • hasdetailattribで指定する引数のアトリビュート名にattr_name.keyを使用することで、そのキーの有無をチェックすることができます。

  • VEXスニペット内の辞書アトリビュートをd@foo(辞書配列アトリビュートの場合はd[]@foo)でバインドすることができます。

  • []を使ってインデックスを指定することができますが、VEXには戻り値の型推論があるので、これを使用する場合には戻り値の型変換をしておくと良いでしょう(辞書のエントリーはどの型も指定可能ですが、コンパイル時に特定の型に解決しなければなりません)。 見つからないキーの参照はゼロの値を返します。

  • VEX/VOPsには辞書を操作するための関数があり、配列を扱ういくつかの関数はdictオブジェクトも扱います。 例えば、dictオブジェクトをlenに渡すと、その辞書内のアイテムの数が返され、isvalidindexに渡すと、その辞書内にキーが存在するかどうか確認することができます。

  • keysは、辞書キーを文字列の配列として返します(VEXの配列は一種類の型でなければならないので、辞書値に対して同等の関数を使用することはできません)。

  • set関数は、引数に辞書キーと辞書値を交互に指定して辞書を構築することができます:

    dict foo = set( 'key1', 3.2, 'key2', 'stringvalue');

VEXでのdict型の扱い方に関する詳細は、VEXのdict型のドキュメントを参照してください。

Python

  • 標準のhou.Geometryメソッド(例えば、Detailアトリビュートにはhou.Geometry.attribValue())を使用して辞書アトリビュートを読み込むことができます。 これは、辞書全体を、Pythonの型(int, float, str, list, dict)が含まれたPython dictとして返します。

  • アトリビュート系のメソッドは純粋なPython構造体を返すので、一度アトリビュート値を読み込んだら、通常のPythonを使ってそのデータを操作することができます。 例えば、len()を使用すれば辞書内のアイテムの数を取得することができ、dict["key"]を使用すればキーに関連付けられている値を取得することができます。

エクスプレッション

  • アトリビュート値を読み込む標準の関数(detail, point, vertex, prim)で引数のアトリビュート名にattr_name.keyを使用することで、エクスプレッション内で辞書キーの値を読み込むことができます。

  • 文字列アトリビュート系の関数(details, points, vertexs, prims)を使用して全体のアトリビュート値を読み込むと、JSONエンコードの文字列が返されます。 しかし、JSONを解読するエクスプレッション関数は用意されておらず、エクスプレッションで文字列を扱う際は、制限付きの文字列制御関数しかありません。

Tip

Attribute Createノードは、空っぽの辞書アトリビュートのみを作成します。実際にジオメトリネットワーク内で辞書値を設定する現在最も良い方法は、Python SOPまたはAttribute Wrangleを使用することです。

Intrinsic(組み込み)アトリビュート

Intrinsic(組み込み)アトリビュート とは、まるでそれが通常のアトリビュートであるかのようにアクセス可能なジオメトリから派生して 計算された値 のことです。例:

Intrinsic(組み込み)アトリビュートの例

Detail

intrinsic:pointcount

ジオメトリ内のポイントの数。

Detail/primitive

intrinsic:bounds

ジオメトリの境界ボックス。

Primitive

intrinsic:measuredarea

ジオメトリの表面積。

Primitive

intrinsic:memoryusage

プリミティブに使用されているメモリ使用量。

To...Do this

利用可能なIntrinsic(組み込み)アトリビュートを調べる

  • ginfo -Iコマンドラインユーティリティは、既知のすべてのIntrinsic(組み込み)アトリビュートのリストをプリントします。

  • Geometry SpreadsheetにIntrinsic(組み込み)アトリビュートを表示することができます。デフォルトでは、非表示になっています。

    コンポーネントレベルでIntrinsic(組み込み)アトリビュートを持ったジオメトリを閲覧している場合、 Intrinsics メニューを使用することで、すべてのIntrinsic(組み込み)アトリビュートを表示したり、スプレッドシートに表示させるIntrinsic(組み込み)アトリビュートを選択することができます。

  • Inspectツールは、検査したジオメトリに対して利用可能なIntrinsic(組み込み)アトリビュートを表示することができます。

Intrinsic(組み込み)アトリビュートを使用する

  • HScriptエクスプレッションやVEXでは、アトリビュート関数を使用することで、Intrinsic(組み込み)アトリビュートを読み込むことができます。例:

    prim("../volume1", 0, "intrinsic:bounds", 0)
    

    (VEX Wrangleスニペット内では、@アトリビュートショートカットを使ってIntrinsic(組み込み)アトリビュートを読み込むことができません。しかし、intrinsic:接頭辞のテクニックを使わなくてもprimintrinsicdetailintrinsicを使用することでIntrinsic(組み込み)アトリビュートを直接読み込むことができます。)

  • Pythonでは、hou.Geometry.intrinsicNames(), .intrinsicValue(), .intrinsicValueDict()を使用することでIntrinsic(組み込み)アトリビュートにアクセスすることができます。

  • グループ構文では、Intrinsic(組み込み)アトリビュートの値に基づいてグループ化をすることができます。例えば、@intrinsic:indexorder<100

Tip

Intrinsic(組み込み)という名前の意に反して、実際にHoudiniやMantraに一部の内部設定を変更させる"Intrinsic(組み込み)"アトリビュートをいくつか書き出すことができます。 例えば、パックプリミティブに対してintrinsic:unexpandedfilenameIntrinsic(組み込み)アトリビュートを設定することができます。

数値精度の変換

Attribute Createノードで作成したアトリビュートでは数値精度を選択することができます。また、Attrib Castノードを使うと、 アトリビュートをより高い精度(メモリを多く消費します)、より低い精度(メモリを節約)に変換することができます。

詳細は、Attrib Castを参照してください。

インデックスや要素数の取得に使用する変数

以下にVEXスニペットで使用できる"疑似アトリビュート"を載せています。 これらのアトリビュートは、現在処理されているエレメントの番号(例えば、ポイント番号)、ジオメトリ/リスト内のエレメントの総数を表現します。 詳細は、VEXスニペットでインデックスや要素数の取得に使用する変数を参照してください。

@elemnum, @ptnum, @primnum, @vtxnum

VEXスニペットを実行している時の現行エレメントの番号を表現します。

@numelem, @numpt, @numprim, @numvtx

VEXスニペットを実行している時のジオメトリ/リスト内のエレメントの総数を表現します。

よく使うアトリビュート

ノードのタイプによって、存在していれば(いくつかの場合では、そのアトリビュートが存在している必要がある)使用される特定のアトリビュートがあります。 そのようなノードは、処理の一部としてアトリビュートを作成/設定します。 ノードが使用/設定するアトリビュートについては、個々のノードのドキュメントを参照してください。

以下では、一般的に複数のノードタイプによって読み/書きされるアトリビュートをいくつか載せています。

ジオメトリアトリビュート

P

vector

ポイントの位置。ビューポートでは、これを使用して3D空間にモデルのポイントを配置します。このアトリビュートを上書きすることで、ポイントを動かすことができます。

On point

N

vector

法線方向。このアトリビュートを上書きすることで、法線を変更することができます。

v

vector

Velocity(速度ベクトル)。 レンダラーは、このアトリビュートを利用して、モーションブラーを追加すべき箇所を判断します。 このアトリビュートは自動的に計算されませんが、いくつかのノード、特にパーティクル系のDOPsは、このアトリビュートを設定/使用することができます。 Trail SOPを使用することで、Velocityをポイントに追加することができます。

id

int

固有のエレメントID。これはエレメント番号(例えば、ポイント番号)と同じではありません。 これは、例えば、ポイント番号が変わっても(ポイント数が変化すると起こり得ます)そのポイントを追跡できるようにポイントに割り当てられるアトリビュートです。 パーティクル系のDOPsでは、このアトリビュートをよく設定/使用しています。

name

string

これは、ボリュームやパックプリミティブなどのプリミティブを名前によってコードから検索できるようにするための値です。 一部のノードでは、このアトリビュートを設定/読み込みます。

piece

int

ジオメトリをピースに分解するノードでは、どのポリゴンフェースが同じピースに属しているのか判断できるように、このアトリビュートを設定することが多いです。 同じピースに属するフェースは、同じ値のpieceアトリビュートを共有します。他のノードでは、このアトリビュートを利用して、ピース別に処理を行なうことができます。

サイズと回転

pscale

float

均一スケール係数。 これは、場所によって使われ方が異なります。 パーティクル/ポイントのレンダリングに関しては、これは、レンダリング時のパーティクル/ポイントのサイズ(ワールド空間単位)を制御します。 インスタンスに関しては、これを利用することで、インスタンスジオメトリを均一にスケールさせることができます。

scale

vector

pscaleはすべての軸において均一な単一スケール係数であるのに対して、このアトリビュートは、軸毎に別々に不均一にスケールをかけることができます。 詳細は、pscaleアトリビュートを参照してください。

width

float

開いたカーブをレンダリングする時、レンダリング時に、この線幅(ワールド空間単位)が設定されます。 このアトリビュートが存在しなかった場合、Mantraは、開いたカーブを太いリボンではなく、細い線としてレンダリングします。

On point

lod

float

詳細レベル。これはインスタンスに使用することができます。

On detail, prim

spritescale

vector

スプライト画像を使ってパーティクルを表示させる時、pscaleに対して追加でスプライトのスケールをかけることができます。

Default (1, 1, 1) On point

spriterot

float

スプライト画像を使ってパーティクルを表示させる時、(カメラ角度を基準に)スプライトの回転を度で加えます。

Default 0 On point

ビューポート表示アトリビュート

gl_wireframe

int

このDetailアトリビュートが1の場合、ジオメトリがビューポート内で常にワイヤーフレーム表示として表示されます。

このDetailアトリビュートが-1の場合、ジオメトリがビューポート内で常にシェーディング表示として表示されます。 従来だとワイヤーフレームのみで描画されるガイドジオメトリに関しては、これによって、ビューポートがどのシェーディングモードだろうとシェーディング表示として表示させることができます。

Default 0 On detail

gl_lit

int

このDetailアトリビュートが0でない場合、ジオメトリは常にライティングなしで表示されます。 現在のところ、これはガイドジオメトリでは無視されます。

Default 0 On detail

gl_showallpoints

int

このDetailアトリビュートが0でない場合、すべてのポイントがジオメトリに繋がっていても、それらのポイントがスプライトとしてレンダリングされるようになります。 従来だと、繋がっていないポイントのみがレンダリングされます。 現在のところ、これはガイドジオメトリでは無視されます。

Default 0 On detail

vm_cuspangle

float

ジオメトリに何も法線がない時に法線の生成に使用されるカスプ(尖)角度を制御します。 180は、完全に滑らかなポイント法線を生成します。

Default 60 On detail

パーティクルアトリビュート

force

vector

現行ポイントのforceアトリビュート。これは、一部のパーティクル系のDOPsで設定/使用されます。 これは、パーティクルに作用しているすべてのフォースを合計して計算されたパーティクルの位置の変化量を表わしています。

rest

vector

各ポイントのRest Position(静止位置)を含んだ昔から使われてきたアトリビュート名で、色々なノードで使用されています。 一部のシェーダでは、Pではなくて、このアトリビュートを使用させることで、ジオメトリを変形させてもプロシージャルにテクスチャがジオメトリに追従するようにさせることができます。

On point

torque

vector

現行ポイントのtorqueアトリビュート。これは、Torque DOPでパーティクルをスピンさせるために設定/使用されています。

up

vector

パーティクルのローカル空間のUpベクトルを表現します。 これは、ジオメトリをポイント上にインスタンス化する際に使用されます。 このアトリビュートを上書きすることで、パーティクルの向きを変更することができます。

accel

vector

廃止。古いPOPsで使用されていました。 新しいDOPパーティクルノードでは、代わりにforceアトリビュートを使用しています。

backtrack

vector4

廃止。パーティクルの以前の位置を格納するために古いPOPsで使用されていました。

orient

vector4

パーティクルのクォータニオンによる向き。 これは、向きを完全に指定することができます。 それに対して、upは1軸の向きしか定義していません。 このアトリビュートが存在していれば、ジオメトリをポイント上にインスタンス化する際にそれが使用されます。

rot

vector4

ジオメトリをポイント上にインスタンス化する際に、他のすべてのアトリビュートが適用された後に使用される追加のオフセットクォータニオン。

nextid

int

最も大きいパーティクルIDを格納したDetailアトリビュートで、これによってHoudiniは次の新しいパーティクルIDを効率的に作成することができます。

pstate

int

パーティクルの状態に関する色々な情報(例えば、パーティクルが生存しているかどうか、停止しているかどうか、前フレームで衝突したかどうかなど)を暗号化したビットフィールド。 色々なパーティクル系のDOPsがこのアトリビュートを読み書きします。

pstateの値は、以下のフラグの合計値です:

0x01

"プライマリ"パーティクル(既存パーティクルから分裂していないパーティクル)。

0x02

次のフレームに行く前に死亡。

0x04

停止。

0x08

衝突した。

0x10

静的ジオメトリまたは移動ジオメトリに引っ付いた。

0x20

リジッドボディダイナミクスシミュレーションに関係付けられている。

0x40

アクティブ。

0x80

CHOPによって動きが上書きされている。

シェーダの上書き

ほとんどのシェーダは、オーバーライドアトリビュートを使用して、そのアトリビュートを持ったエレメントのシェーディング方法を変更します。

Cd

vector

ディフューズカラーオーバーライド。ビューポートは、これを使用してOpenGLジオメトリにカラーを付けます。

Alpha

float

アルファ透明度オーバーライド。ビューポートは、これを使用してOpenGLジオメトリのアルファを設定します。

Cs

vector

スペキュラーカラーオーバーライド。

Cr

vector

反射カラーオーバーライド。

Ct

vector

透過カラーオーバーライド。

Ce

vector

発光カラーオーバーライド。

rough

float

粗さオーバーライド。

fresnel

float

フレネル係数オーバーライド。

shadow

float

シャドウ強度オーバーライド。

sbias

float

シャドウバイアスオーバーライド。

レンダリングアトリビュート

uv

vector

ポイント/頂点のUV座標。 このベクトルの最初の2つのコンポーネントには、現在のUとVの座標が格納されます。

Note

uvは、テクスチャ座標を格納するためのHoudiniで昔から使われてきたアトリビュート名です。 同じジオメトリ上に複数のUVレイアウトが持てるように、他のアトリビュートにテクスチャ座標を格納することができます。 ほとんどのテクスチャ関連のノードには、使用するUVアトリビュート名を指定するためのフィールドが用意されています。

On point, vertex

material

string

このプリミティブのシェーディングに使用するマテリアルのノードパス。 これは、オブジェクトのマテリアルを上書きします。

instance

string

現行ポイントのinstanceアトリビュート。ポイント上にインスタンス化させたいジオメトリのパスを格納します。 ここには、ジオメトリファイルのファイルパス、または、ジオメトリオブジェクトまたはジオメトリノードのop:構文によるパスを指定することができます。 このアトリビュートを上書きすることで、インスタンス化されるジオメトリを変更することができます。

On detail, prim

rishade

string

Detail/Primitiveアトリビュート。RenderManシェーダの名前。

On detail, prim

See also

ジオメトリ

学ぼう

モデリング

地形

粉砕

破壊を参照してください。

次のステップ

導師レベル