On this page |
概要
これは非常に強力な低レベルにアクセス可能なノードであり、VEXに詳しい熟練者が、コードを使ってボクセル値を調整することができます。
このノードは、Volume VOP SOPに相当しますが、VOPネットワークの代わりにテキストのVEXスニペットを使用します。
Warning
このノードを扱うには、VEX言語を理解している必要があります。 そうでないと、このノードを使えば不正なコードを記述しがちです。
このノードは、 入力ボリュームのすべてのボクセル ( Bind Each Volume to Density パラメータがオンでない限り)に対してスニペットを実行します。 スニペットは、アトリビュートを変更することで、入力ジオメトリを編集することができます。 アトリビュートとVEX関数を使うことで、他のジオメトリの情報にアクセスすることができます。
-
ノードをクリックすると、スニペットからのエラー出力を確認することができます。
-
VEX関数の
ch
を使ってパラメータを評価することができます。 パスは、このノードの相対パスです(ch("parm")
は、このノードのparm
パラメータを評価します)。 この評価は、現行時間で実行されます。 -
Volume Mix SOPとは違い、このノードはローカル変数を使用しません。 さらに、すべてのバッククォートによるエクスプレッションと
$F
変数は、現行時間ではなく、フレーム1で評価されます。 代わりにFrame
、Time
、TimeInc
を使ってください。
構文
ボクセル値の読み込みと修正
ボリュームの現行ボクセル値は、@volume_name
として利用可能です。
この変数を読むことで、現行値を取得することができ、その変数を割り当てることで、値を変更することができます。
例えば、floatボリュームfoo
のすべてのボクセルの値に0.1
を加算するには:
@foo += 0.1
ボリュームに名前がなければ、ボリュームは自動的に@density
にバインドされます。
入力に複数の名前付きボリュームがあれば、別々の方法で別々のボリュームを修正する単一のスニペットを記述することができます。例:
@foo += 0.1 @bar += 0.2 @baz += 0.3
あるいは、 Bind Each Volume to Density を有効にすることができます。
これは、すべての入力ボリュームの名前がdensity
として動作するので、同じスニペットを使って、すべてのボリューム内のすべてのボクセルを修正することができます:
// 同じ方法で@foo, @bar, @bazを修正します。 // (Bind Each Volume to Densityがオンの時) @density += sin(@P.x)
Note
Point WrangleやAttribute Wrangleのノードの挙動とは異なり、
不明な@name
変数へ書き込んでも、ボリュームは作成されません。
VEX変数
一時的な変数を作成することができます。 例えば、以下のコードは、ポイントからのオフセット位置を読みます。
vector temp = @P; temp += {0.1, 0.2, 0.3}; @density = volumesample(@OpInput1, 0, temp);
バインド変数
いくつかの変数がVolume VOPコンテキストにバインドされています。
変数の頭に@
を付けることで、それらの変数にアクセスすることができます。
P
現行ボクセルの中心の位置。
ix
, iy
, iz
現行ボクセルの整数インデックス。VDBでは、これはマイナスの値になる場合があります。
resx
, resy
, resz
現行ボリュームプリミティブの解像度。VDBでは、これはアクティブボクセル領域のサイズです。
dPdx
, dPdy
, dPdz
0番目のボクセルのX,Y,Zのエッジの長さと向きを指定したベクトル。
center
SOP空間内のボリュームの中心。
Time
現行時間(秒)。
Frame
現行時間(フレーム)。
TimeInc
フレーム間の時間の増分値(秒)。
OpInput1
, OpInput2
, OpInput3
, OpInput4
Fileパラメータを受け取るVEXオペレーションで、このSOPの該当する入力を参照するために使用することができる文字列。
パラメータ
Code
Group
入力ジオメトリ内の、これらのボリュームのみに対してプログラムを実行します。 このフィールドを空っぽのままにすると、入力ジオメトリ内のすべてのボリュームを修正します。
(上記のボクセル値の読み込みと修正を参照してください。)
Bind Each to Density
ノードがスニペットを適用する方法を変更します。
これをオフにすると、名前によって入力内の特定のボリュームを参照しなければなりません(例えば、@foo
)。
これをオンにすると、すべての入力ボリュームが@density
として扱われるので、1つのスニペットを記述するだけで、
名前に関係なく、すべての入力ボリュームに影響を与えることができます。
(上記のボクセル値の読み込みと修正を参照してください。)
VEXpression
Pointアトリビュートを操作するVEXコードのスニペット。
@variable_name
構文を使えば、ジオメトリアトリビュートにアクセスすることができます。
Volumes To Write To
ボリュームの名前がこのパターンに一致すれば、それらのボリュームのみを修正します。 デフォルトのパターンでは、どのボリュームも修正することができます。 スニペットで 実際に 修正されるボリュームのみをリストにすることで、ノードを高速化することができます。
例えば、以下のスニペットでは、density
ボリュームのみが修正されます。
temperature
ボリュームは修正されず、単に読み込まれるだけです。
@density = @temperature;
しかし、曖昧な記述なので、このノードはdensity
を修正するためにtemperature
を コピー しています。
これは時間とメモリを費やします。
これを回避するには、このパラメータをdensity
に設定することで、ノードはtemperature
のコピーをしなくなります。
もちろん、これをするには、書き込み可能なボリュームのリストを明示的に管理する必要があります。
Enforce Prototypes
@
構文を使った自動バインドは便利ですが、あなたのシステムが複雑になるほど、@
バインドでのタイプミスが、存在しないアトリビュートと
何も警告せずにバインドしてしまう危険性があります。
このオプションは、すべての@
バインドを使用前にプロトタイプとして明示的に宣言するように強制します。
Bindings
Autobind by Name
name
Primitiveアトリビュートを使って、どのボリュームがどのパラメータにバインドさせるのかを決定します。
name
アトリビュートが存在しなければ、1番目のボリュームがdensityにバインドされます。
"foo"のようなname
は、floatパラメータ"foo"にバインドされます。
"foo.x"のname
は、ベクトル(3つのfloat)パラメータ"foo"のX成分にバインドされます。
"foo.zx"のようなname
は、マトリックス(3行3列)パラメータ"foo"のZ、X成分にバインドされます。
Primitive, Primitive Name, VEX Parameter
各プリミティブのバインドを手動で指定します。これは、指定した名前のname
アトリビュートを持ったプリミティブと等価です。
Primitive Nameが空っぽでない場合、それに合致した名前のプリミティブが、指定したVEXパラメータにバインドされます。
Only Output Created Geometry
入力のボリュームを出力しません。その代わりに、VOPで作成されたジオメトリのみが出力されます。 これは、ボリュームからポイントを生成する時に役に立ちます。 繰り返したいボリュームにダミーの書き出しをしなければならないことに注意してください。
Evaluation Node Path
ch()
などのVEX関数は、通常では、このノードを基準に評価します。
ここでパスを指定すれば、パス検索の開始場所を上書きすることができます。
これは、トップレベルのデジタルアセットが検索ルートになるようにデジタルアセットへ組み込む時に役に立ちます。
Export Parameters
このパターンを使ってVEXシェーダのExportオプションを上書きすることで、特定のボリュームへの書き込みを回避することができます。 パターンはVEXパラメータに一致しますが、バインドしたボリュームには一致しません。 そのボリュームは、読み取り専用になります。
Examples
The following examples include this node.
このサンプルでは、独自の侵食DOPシミュレーションを作成する方法について説明しています。
See also |