On this page | |
Since | 16.0 |
概要 ¶
このノードは、入力内のポイント毎またはプリミティブ毎にVEXエクスプレッションを実行し、その結果を使って、そのポイント/プリミティブ上にアトリビュートの値を設定します。
このノードは、以前に使われていた古いPoint SOPよりも高速です。 なぜなら、VEXエクスプレッションはコンパイルされて潜在的に並列処理をさせることができるからです。 Point SOPとは違い、このノードはコンポーネント別にエクスプレッションを分けることなく、単一のVEXエクスプレッションを実行してアトリビュート値を生成することができます。
VEXエクスプレッションの記述に関する詳細は、以下を参照してください:
Point SOPに何が起きたのか? ¶
バージョン16以前のHoudiniのPoint SOPでは、HScriptエクスプレッションを使って、よく使用する特定のパラメータを修正していました。 Houdini16からは、Point SOPを配置しようとすると、代わりにAttribute Expression SOPが作成されます。何故、私どもがこのように変更したのでしょうか?
Point SOPは、使い勝手と理解のしすさという観点では本当に良かったです。 Point SOPでは、簡単なエクスプレッションでローカル変数を使用できたので、アーティストが三角関数と線形代数を学ぶのに素晴らしいツールでした。 それなのに、なぜ私どもがそれをVEXに置換したのでしょうか?
Point SOPはパフォーマンスが良くありませんでした。Point SOPはベクトルコンポーネントを別々に扱っていたので、並列計算の能力が発揮できませんでした。 最悪なのは、Point SOPは、今後もっと重要になってくるであろうコンパイルしたジオメトリノードワークフローで動作できないことです。
Houdiniでのアドホック(一時的な)ジオメトリの操作におけるVEXの今後に関する考察は、VEXとアトリビュートについてを参照してください。
エクスプレッションの書き方 ¶
-
self
変数がエクスプレッション内の現行(入力)アトリビュート値として事前に定義されています。 -
@name
を使えば、ジオメトリ上の他のアトリビュートの値を読み込むことができます。詳細は、スニペットでアトリビュートを読み込む方法を参照してください。 -
@elemnum
(または@ptnum
)疑似変数には現行のポイント/プリミティブのインデックスが格納されます。これは、エレメント毎に異なるランダム値を取得するための乱数シードとして役立ちます。 -
現行のフレーム番号、時間、時間増分を参照するには、VEXエクスプレッションで
@Frame
,@Time
,@TimeInc
を使用します。VEXに用意されていない他のグローバル変数にアクセスしたいのであれば、Constant Valueパラメータを使用します。 -
Wrangleノードとは違って、完全なVEXステートメントを記述する必要はなく、VEXエクスプレッションだけを記述することができます。複数行の関数を記述したり、フロー制御が必要な場合は、代わりにAttribute Wrangleを使用してください。
ベクトルの扱い方 ¶
アトリビュートがスカラー(単純なint
やfloat
)であれば、エクスプレッションにself
を使用することで現行値を参照したり、単一値を計算することができます。
例えば、すべてのポイントの現行値を上げたいのであれば、以下のように記述します:
self + 1.0
このエクスプレッションは、ベクトルアトリビュートも扱います: その場合は、ベクトルの各コンポーネントに1.0
が加算されます。(一般的には、スカラー値に対して動作する演算子と関数は、ベクトルに対してもコンポーネント毎に動作します。)
とはいえ、ベクトルアトリビュートを扱う時は、通常では、現行値からそれぞれのコンポーネントを引き出す必要があります。
-
もしくは、単純に配列/ベクトルのインデックスを使って、それぞれのコンポーネントを引き出すことができます:
self[0]
,self[1]
,self[2]
など。この形式は、アトリビュートのインデックス自体が変数またはエクスプレッションの時に役立ちます。 -
可読性を良くしたいのであれば、任意で
self.x
,self.y
,self.z
を使用することで、それぞれのコンポーネントにアクセスすることができます。他にも、カラーを扱う時には
self.r
,self.g
,self.b
(vector4
ではさらにself.a
)を使用することができます。
個々のコンポーネントを設定するには、set()
関数を使用します。例えば、カラーアトリビュートで赤と緑の量を半分に、青の量を2倍にするには以下のように記述します:
set(self.r * 0.5, self.g * 0.5, self.b * 2.0)
Constant Value ¶
VEXでキーフレームの値にアクセスするには、Spareパラメータを作成してからch
関数でそのパラメータを参照する必要がある事が多いです。
このノードには、この目的のために事前に作成された Constant Value パラメータが備わっているので、Spareパラメータがあなた自身で作成する必要はありません。
このパラメータにはHScriptエクスプレッションまたはキーフレームアニメーションを使用することができ、VEXエクスプレッションでvalue
変数を使うことでその値を参照することができます。
Note
このパラメータの値は、入力ジオメトリに対して 一度だけ 計算されます。ポイント/プリミティブ毎に値を可変させることができません。
例えば、エクスプレッションでgeo1
の現行ポジションを使用する必要があれば、 Constant Value を以下のように設定します:
|
|
|
そして、エクスプレッションでvalue.x
、value.y
、value.z
のように記述することでこれらの値を取得することができます。
サンプル ¶
入力ジオメトリ内のポイントを単純にランダムにジッター(微震)させるには、以下のようにします:
-
Attribute Class を“Points”に設定します。
-
Attribute を“Position (P)”に設定します。
-
VEXpression を以下のように設定します:
set(self.x + rand(@elemnum) - 0.5, self.y + rand(@elemnum * 10) - 0.5, self.z + rand(@elemnum * 100) - 0.5)
-
set()
はベクトルを返します。この関数を使用することで、現行ベクトル値のコンポーネントに基づいて新しいベクトル値を構築することができます。 -
@elemnum
は現行ポイントのインデックスです。この例では、それを乱数ジェネレータのシードとして使用しているので、各ポイントが違う数値を持つようになります。さらに、各コンポーネントが別の数値を持つように変更(* 10
と* 100
)を加えています。 -
rand()
は0以上1未満の数値を生成します。各ポイントが各方向で-0.5から+0.5の範囲でランダムに動くように、その値から0.5を減算しています。
-
-
エクスプレッションを以下のように変更することで、そのエクスプレッションをパラメトリックにすることができます:
set(self.x + (rand(@elemnum) - 0.5) * chf("scale"), self.y + (rand(@elemnum * 10) - 0.5) * chf("scale"), self.z + (rand(@elemnum * 100) - 0.5) * chf("scale"))
そして、 Create Parametersボタンをクリックすると、そのエクスプレッション内の
ch()
参照に基づいて自動的に Scale パラメータが作成されます。 この新しいパラメータを使用することで、ジッター効果にスケールをかけることができます。
Tipsとメモ ¶
-
Attribute を“Custom”に設定し、 Name を存在しないアトリビュートに設定すると、このノードは、そのアトリビュートを作成します。この場合、
self
は0
(または{0, 0, 0}
、空っぽの文字列のように指定したデータに応じた“ゼロ”の値になります)になるので、他のアトリビュートの値を使ってエクスプレッションを構築することになります。 -
例えば
P
(position)アトリビュートを修正する場合、エクスプレッションにはself
の代わりに@P
を使用することができます。この唯一のデメリットは、他の箇所で容易にそのエクスプレッションを再利用することができないことです。 -
VEXの三角関数ではラジアンを使用するのに対し、HScriptエクスプレッションでは度を使用します。radiansを使用すれば、度をラジアンに変換することができます。
-
VEXエクスプレッションでch関数を使用することで、このノード上のパラメータを参照することができます。そして、そのエクスプレッションの右側にある Create Parametersボタンをクリックすれば、その
ch
コールに基づいて自動的にそのパラメータが作成されます。これによって、エクスプレッション内の値をインタラクティブに制御することができます。 -
エクスプレッションによってベクトルの1コンポーネントだけを変更したいのであれば、ある“テクニック”を使用した方が簡単です。それは、
self
(現行値)のコンポーネント毎にエクスプレッションを適用し、その変更をvalue
(オプションのConstant Value)で乗算します。そして例えば、 Constant Value を0, 1, 0
に設定してYコンポーネントだけを修正することです。例えば、以下のエクスプレッションでは、各コンポーネントに現行ポイント番号のsinを追加します:
self + sin(radians(@ptnum))
Yコンポーネントだけを修正するには、そのエクスプレッションを以下のように変更します:
self + value * sin(radians(@ptnum))
…そして、その定数値を以下のように設定します:
0, 1, 0
-
このエクスプレッションには1行しか記述することができないので、ベクトルコンポーネントを個々に変更するとすぐに、そのエクスプレッションが長くなってパラメータエディタで扱いにくくなってしまいます。
⌃ Ctrl + Eを使ってフローティングエディタウィンドウでそのパラメータ値を開くことで、少し扱いやすくなります。
または、代わりにAttribute Wrangleノードを使用すれば別々の行でそれらのコンポーネントを扱うことができるので、その方が簡単です。
例えば、以下のように長いエクスプレッションが:
set(self.x + rand(@elemnum) - 0.5, self.y + rand(@elemnum * 10) - 0.5, self.z + rand(@elemnum * 100) - 0.5)
…Attribute Wrangleでは別々のステートメントとして扱いやすくなります:
@P.x += rand(@elemnum * 1) - 0.5; @P.y += rand(@elemnum * 10) - 0.5; @P.z += rand(@elemnum * 100) - 0.5;
-
このノードは、あなたが記述したエクスプレッションをコンパイル用に完全なVEXスニペットに自動的に変換します。これは、デバッグする時、またはエクスプレッションが複雑になってしまった場合にその生成されたコードをAttribute Wrangle SOPにコピーしたい時に役立ちます。生成されたVEXコードを確認するには、 Generated Code タブをクリックしてから Update Code をクリックします。
-
VEXコードにエラーがあると、そのノードでエラーが起きます。そのノード上でを押せば、そのノードの情報ウィンドウで、そのエラーのテキストを確認することができます。
そのエラー報告には、生成されたコードで参照するべき行/列の番号が記されています。 生成されたVEXコードを確認するには、 Generated Code タブをクリックしてから Update Code をクリックします。
-
Attrib Create SOPとは違い、このノードはローカル変数を使用しません。
-
このノードには、エクスプレッションで他のジオメトリを参照するための複数の入力があります。通常では、VEXジオメトリ関数は
input
を1番目の引数として受け取ることで、ジオメトリデータの読み込み先の入力を指定します。他の入力からアトリビュートを読み込むには、例えばv@opinput1_P
のように、そのアトリビュートの名前の頭にopinputnum_
を付けます(詳細は、スニペットでアトリビュートを読み込む方法を参照してください)。
パラメータ ¶
Group
このノードの影響を受けるコンポーネント。ここには、グループの名前やコンポーネント番号を指定することができます。このフィールドが空っぽであれば、すべての入力ジオメトリがこのノードの影響を受けます。
Group Type
2つ以上のタイプのグループに同じ名前があったり、グループフィールドにコンポーネント番号を使用している場合、使用するグループフィールドのコンポーネントタイプを手動で設定することができます。
VEXpressions ¶
Attribute Class
反復させるコンポーネントタイプ。例えば、ポイントまたはプリミティブ(ポリゴン)。
Attribute VEXpressions
+と-のボタンを使用することでエクスプレッションを追加削除することができます。
Enable
このエクスプレッションを入力に適用します。これは、エクスプレッションを有効/無効に切り替えることで、ジオメトリに対するそのエクスプレッションの効果を確認するのに役立ちます。
Attribute
使用頻度の高いアトリビュートのリストから選択するか、または“Custom”を選択してアトリビュート名を入力します。
Name
Attribute が“Custom”の時、修正するアトリビュートの名前を入力します。
Type
Attribute が“Custom”の時、修正するアトリビュートのタイプを選択します。このタイプが入力ジオメトリ内のその名前のアトリビュートのタイプと合致しなくても、このノードはエラーにはなりませんが、変な結果を招いてしまうことがあります。
Constant Value
このノードは、このパラメータの値を計算して、その値をvalue
変数としてVEXエクスプレッションで利用できるようにします。
これは、キーフレーム値を取得して、その値をVEXで利用できるようにするのに役立ちます。
詳細は、Constant Valueの使い方を参照してください。
VEXpression
アトリビュートに対して新しい値を生成するVEXエクスプレッション。self
を使用することで、現行のポイント/プリミティブの入力値を参照することができます。
ベクトルアトリビュートに関しては、set()
をset(self.x, self.y., self.z)
のように使用することで新しいベクトルを生成することができます。詳細は、このノードのドキュメントを参照してください。
Bindings ¶
Evaluation Node Path
chなどのVEX関数での相対パスは、このノードパスを基準にします。デフォルト値(.
)は、その相対パスをこのノードを基準にします。
これは、デジタルアセットに組み込む際に、パスをそのアセットのルートを基準にしたい場合に役立ちます。
Attribute to Match
@opinputinputnum_name
構文は、他の入力のそれに該当するエレメントからアトリビュートの値を取得することができます。
このパラメータが空っぽの場合、この“該当する”エレメントは、このノードが現在処理しているエレメントと同じインデックス(例えば、ポイント番号)のエレメントになります。
アトリビュートの名前を指定した場合、この“該当する”エレメントは、その名前のアトリビュートで現行エレメントと同じ値を持ったエレメントになります。
詳細は、VEXスニペットのページの他の入力からアトリビュートにアクセスする方法を参照してください。
例えば、“Attribute to Match”としてid
を使用して、12
に設定されたid
アトリビュートのポイントを処理する場合、@opinput1_P
の記述によって、id
が12
に設定されている2番目の入力のポイントのP
アトリビュートが取得されます。
Include Files
生成されるVEXに含めるファイルをスペースで区切たリスト。例えば、voplib.h shading.h
です。このリストを使用することで、独自のヘルパー関数をそのエクスプレッションで利用できるようになります。
Update Normals If Displaced
Attribute Class が“Points”で、N
アトリビュートではなくP
(position)アトリビュートを修正すると、そのN
アトリビュートの法線は、その新しいポジションでは古くなってしまいます。
このオプションを有効にすると、このノードは、ポジションが変わった時に頂点/ポイントの法線を自動的に更新します。
Generated Code ¶
Update Code
VEXpressions タブのエクスプレッションに基づいて、生成されたコードフィールドを更新します。このコード表示自体は更新されないので、コードをチェックする前にこのボタンを常にクリックして必ず最新状態にしてください。
Generated Code
VEXpressions タブのエクスプレッションに相当するVEXスニペットを表示します。これは、デバッグする時、またはエクスプレッションが複雑になってしまった場合にその生成されたコードをAttribute Wrangle SOPにコピーしたい時に役立ちます。これは読み取り専用です。つまり、このコードを変更してもノードには影響ありません。このフィールド自体が更新されないので、コードをチェックする前に Update Code を常にクリックして必ず最新状態にしてください。
See also |