On this page | |
Since | 16.0 |
これは、VEXに詳しい熟練者がコードを使ってチャンネルデータとアトリビュートを修正することができる非常に強力なローレベルノードです。
このノードは、Channel VOPに相当しますが、VOPネットワークの代わりにテキストのVEXスニペットを使用します。
このノードは、入力チャンネル内のすべてのチャンネル(または、 Iterate パラメータに応じたチャンネルのグループ)に対してスニペットを実行します。 さらに、このノードは、1番目の入力チャンネル範囲に基づいたすべてのサンプルに対してスニペットを実行します。 このスニペットは、バインドされたパラメータを変更することで、その入力チャンネルを編集することができます。 このスニペットにVEX関数を使用することで、他のチャンネルまたはジオメトリの情報にアクセスすることができます。
-
スニペットから吐き出されたエラーを確認するには、ノード上でを押します。
-
パラメータを評価するには、
ch
VEX関数を使用します。 このパスは、このノードを基準にしています(ch("parm")
は、このノード上のparm
パラメータを評価します)。VEX関数に対して時間を明示的に指定しなかった場合は、現在のサンプル時間でこの関数が評価されます。
Note
Tabメニューから Transform VOP ノードを作成すると、Channel VOPが作成されて、そのVOPがトランスフォームチャンネルと拘束を扱うように設定されます。
コンテキスト ¶
このノードは、 CHOPコンテキスト でVEXスニペットを実行し、以下のグローバル変数が利用可能です。
グローバル変数 ¶
float |
V
|
現行サンプルの値。この変数は、関数によって新しい値に設定してください。 この変数は、1番目の入力のチャンネルの値に初期化されます。 |
|
int |
I
|
Read only |
現行チャンネルのインデックスまたはサンプルの番号。 現行フレームモードでのみ時間依存です。 |
int |
IN
|
Read only |
現行チャンネルのインデックスまたはサンプルの番号。 時間依存ではありません。 |
int |
S
|
Read only |
現行チャンネルの開始インデックス。これは最初のサンプルのインデックスです。 |
int |
E
|
Read only |
最後のサンプル(終了サンプル)のインデックス。 |
float |
SR
|
Read only |
現行チャンネルのサンプルレート。 |
int |
L
|
Read only |
チャンネルの長さ(サンプルの総数)。 |
int |
C
|
Read only |
現行チャンネルのチャンネル番号。複数チャンネルを処理する時は、この番号は、現在評価中のチャンネルのインデックスです。 |
int |
NC
|
Read only |
CHOPが影響を与えるチャンネルの総数。 |
string |
CN
|
Read only |
現行チャンネルの名前。 |
float |
FF
|
Read only |
評価されているサンプルに相当するfloatのフレーム番号。 現行フレームモードでのみ時間依存です。 |
float |
FFN
|
Read only |
評価されているサンプルに相当するfloatのフレーム番号。 時間依存ではありません。 |
float |
Frame
|
Read only |
評価されているサンプルに相当するfloatのフレーム番号。 強制的に時間依存です。 |
float |
T
|
Read only |
評価されているサンプルに相当する秒の時間。 現行フレームモードでのみ時間依存です。 |
float |
TN
|
Read only |
評価されているサンプルに相当する秒の時間。 時間依存ではありません。 |
float |
Time
|
Read only |
評価されているサンプルに相当する秒の時間。 強制的に時間依存です。 |
構文 ¶
VEX変数 ¶
一時的なVEX変数を作成することができます。
通常のVEX変数には@
接頭辞は必要ありません。
例えば、以下のコードはpx
とpy
を入れ替えます。
float temp = @px; @px = @py; @py = temp;
拘束用のVEX構造体 ¶
CHOP拘束は、$HFS/houdini/vex/include/chop_constraints.h
で定義されたVEX構造体を利用します。
chopTRS ¶
この構造体は、トランスフォームチャンネルを保持します。
struct chopTRS { vector t; // tx ty tzチャンネル vector r; // rx ry rzチャンネル vector s; // sx ry rzチャンネル void fromIdentity(); void fromMatrix(const matrix m; const vector pivot; const int trs; const int xyz); void fromMatrix(const matrix m); }
chopConstraintContext ¶
この構造体は、現在評価されているトランスフォームチャンネルを保持します。 これは、グローバル変数の'C'と'I'を抽象化しているので、現行時間と現行チャンネルインデックスを気にする必要がありません。
struct chopConstraintContext { vector t; // tx ty tz channels vector r; // rx ry rz channels vector s; // sx sy sz channels void init(); void init( vector t0; vector r0; vector s0; const string prefix0 ); void fromMatrix(const matrix m; const vector pivot; const int trs; const int xyz); void fromMatrix(const matrix m); chopTRS fetchInput( const int i ); float fetchInput( const int i; const string name; int result ); float fetchInput( const int i; const int index; int result ); matrix fetchInputMatrix( const int i ); int isConnected( const int i ); int numInputs(); // 名前でチャンネル入力を評価します。 float chinput( int i; const string name; int ret ); // 現行CHOPノードのfloatパラメータを評価します。 float chf( const string parm ); // 現行CHOPノードの整数パラメータを評価します。 int chi( const string parm ); // 現行CHOPノードのベクトルパラメータを評価します。 vector chv( const string parm ); }
以下は、4つの入力の移動量をブレンドする方法の例です。
// コンテキストを宣言します。 // これは、トランスフォームWrangleで自動的に宣言されます。 chopConstraintContext c; // トランスフォーム入力を取得します。 chopTRS c0 = c->fetchInput(0); chopTRS c1 = c->fetchInput(1); chopTRS c2 = c->fetchInput(2); chopTRS c3 = c->fetchInput(3); matrix m0 = c->fetchInputMatrix(0); matrix m1 = c->fetchInputMatrix(1); matrix m2 = c->fetchInputMatrix(2); matrix m3 = c->fetchInputMatrix(3); // トランスフォームを計算します。 @t = c0.t + c1.t + c2.t + c3.t; @t *= 0.25; @r = c0.r; @s = c0.s;
パラメータ ¶
Code ¶
Channel Names
1番目の入力が接続されていない時に作成するチャンネル名をスペースで区切ります。 Scope パラメータと同じパターンに対応しています。
Channel Count
1番目の入力が接続されていない時に何度も Channel Names を反復させます。
Iterate
チャンネルとサンプルの反復のさせ方。
Over Channels and Samples
一度にチャンネル毎にすべてのサンプルを反復させます。
V
グローバル変数を使用することで、現在のチャンネル値を読み書きすることができます。
Over Samples and Channels
一度にサンプル毎にすべてのチャンネルを反復させます。
V
グローバル変数を使用することで、現在のチャンネル値を読み書きすることができます。
Over Samples and Every Nth Channels
一度にサンプル毎にチャンネルを反復させますが、チャンネルグループ単位で評価します。
チャンネルグループのサイズを定義するには、 Iterate Step を使用します。
Iterate Names の名前の頭に@
を付けることで、現在のチャンネル値を読み書きすることができます。
Over Samples and Every Translate/Rotate/Scale
一度にサンプル毎にトランスフォームチャンネルを反復させます。
@t
で移動ベクトルに、@r
で回転ベクトルに、@s
でスケールベクトルにアクセスすることができます。
また、struct chopConstraintContext
はc
変数にバインドされています。
2番目の入力トランスフォームをstruct chopTRS
として返すには、c->fetchInput(1)
を使用します。
2番目の入力トランスフォームをマトリックスとして返すには、c->fetchInputMatrix(1)
を使用します。
Over Clip
C
とI
の変数を0に設定するスニペットを一回実行します。
これは、スニペットを使ってすべてのチャンネルを分析したい時に使用します。
クリップアトリビュートをグローバル変数V
やチャンネルデータに書き出すことはできません。
chattr
やchsetattr
を使用することで、そのクリップアトリビュートを読み書きすることができます。
Over Channels
I
変数を0に設定するスニペットをチャンネル毎に一回実行します。
これは、スニペットを使って個々のチャンネルを分析したい時に使用します。
チャンネルアトリビュートをグローバル変数V
やチャンネルデータに書き出すことはできません。
chattr
やchsetattr
を使用することで、そのチャンネルアトリビュートを読み書きすることができます。
Over Sample
C
変数を常にゼロに設定するスニペットをサンプル毎に一回実行します。
これは、スニペットを使って一回のサンプルですべてのチャンネルを分析したい時に使用します。
サンプルアトリビュートをグローバル変数V
やチャンネルデータに書き出すことはできません。
chattr
やchsetattr
を使用することで、そのサンプルアトリビュートを読み書きすることができます。
Iterate Step
Iterate が Every Nth Channels の時に、グループ化するチャンネルの数を設定します。
Iterate Names
Iterate が Every Nth Channels の時に、バインド名を表現したスペース区切りの文字列。
Iterate Nameの名前の頭に@
を付けることで、チャンネルを読み書きすることができます。
VEXpression
チャンネルを制御するVEXコードのスニペット。
@channel_name
構文を使用することで、バインドされたチャンネルやV
にアクセスして、現在のチャンネルサンプルに書き出すことができます。
Evaluation Node Path
ch()
などのVEX関数は、通常ではこのノードを基準に評価されます。
ここにノードパスを入力することで、そのパス検索を開始するノードパスを上書きすることができます。
これは、トップレベルのデジタルアセットが検索ルートになるようにデジタルアセットへ組み込む時に役に立ちます。
Enforce Prototypes
スニペット内でまず型宣言として@
バインドを宣言しないと、それらのバインドが使用できないようにします。
これは、アトリビュート(例えば、@Cd
)と@ptnum
や@Frame
といった“便利”バインドのどちらにも当てはまります。例:
// バインドを宣言します。 int @ptnum; float @Frame; vector @Cd; // 宣言の後にバインドを使用します。 int pointnum = @ptnum; float red = @Cd[0] / @Frame;
@
構文を使った自動バインドは便利ですが、シーンが複雑になるにつれて、@
バインドのタイプミスが原因で不意に存在しないアトリビュートをバインドしてしまう危険性があります。
Channel ¶
Align
使用する整列オプション。
Extend to Min/Max
最も早い開始と最も遅い終了を探し、拡張条件を使って全ての入力をその範囲まで拡張します。
Stretch to Min/Max
最も早い開始と最も遅い終了を探し、それぞれのチャンネルの開始と終了をその範囲まで拡張します。
Shift to Minimum
最も早い開始を探し、全てのチャンネルをシフトするので、その全てのチャンネルがそのインデックスで開始します。 全てのチャンネルは、最長の長さまで拡張されます。
Shift to Maximum
最も遅い終了を探し、全てのチャンネルをシフトするので、その全てのチャンネルがそのインデックスで終了します。 全てのチャンネルを最長の長さまで拡張します。
Shift to First Interval
全てのチャンネルを1番目のチャンネルの開始までシフトし、1番目の入力の範囲を使って全ての入力をサンプリングします。
Trim to First Interval
全てのチャンネルを1番目のチャンネルの範囲までトリムします。
Stretch to First Interval
全てのチャンネルを1番目のチャンネルの範囲まで拡張します。
Trim to Smallest Interval
全てのチャンネルを最小開始/終了の区間までトリムします。 開始および終了値が同じチャンネルでなくても構いません。
Stretch to Smallest Interval
全てのチャンネルを最小開始/終了の区間まで拡張します。 開始および終了値が同じチャンネルでなくても構いません。
Range
生成するデータの範囲を指定します。
Use Full Animation Range
アニメーションする範囲全て。
Use Current Frame
現行フレームのサンプルのみ。
Use Start/End
Start パラメータから End パラメータまでの範囲を指定します。
Use Value Animation
範囲は、評価済みのValueパラメータの中で利用できるキーの範囲から取得されます。
Start
チャンネル範囲の開始時間。
End
チャンネル範囲の終了時間。
Sample Rate
CHOPのサンプルレート。
Number of Threads
チャンネルサンプルの評価に使用するスレッドの数。 デフォルトはスレッド化なしです。
Houdiniは入力ジオメトリのサンプル毎にVEXプログラムを評価するので、CHOPノードのサンプル数が多い時には、マルチプロセッサやマルチコアが搭載されたマシンでスレッド化することで、その恩恵を多大に受けることができます。
Common ¶
これらのパラメータのいくつかは、すべてのCHOPノードで利用できない場合があります。
Scope
影響を受けるチャンネルを決めるために、いくつかのCHOPにはスコープ文字列があります。
Scope 内では、パターン(例えば、*
(すべてに一致)、?
(1文字に一致))が使用可能です。
以下に可能なチャンネル名マッチングオプションの例を載せます:
chan2
単一チャンネル名に一致します。
chan3 tx ty tz
スペース区切りで4つのチャンネル名に一致します。
chan*
chan
で始まる各チャンネルに一致します。
*foot*
チャンネル名にfoot
が含まれる各チャンネルに一致します。
t?
?
は1文字に一致します。t?
はt
で始まる2文字のチャンネルに一致します。
blend[3-7:2]
指定した範囲の番号のチャンネルblend3
、blend5
、blend7
に一致します。
blend[2-3,5,13]
チャンネルblend2
、blend3
、blend5
、blend13
に一致します。
t[xyz]
[xyz]
はチャンネルtx
、ty
、tz
に一致します。
Sample Rate Match
Sample Rate Match オプションは、複数の入力CHOPのサンプルレートが異なる場合を処理します。
Resample At First Input’s Rate
1番目の入力のレートを使って他の入力を再サンプリングします。
Resample At Maximum Rate
一番高いサンプルレートに再サンプリングします。
Resample At Minimum Rate
一番低いサンプルレートに再サンプリングします。
Error if Rates Differ
異なるサンプルレートを受け入れません。
Units
Timeパラメータの単位。
例えば、秒(デフォルト)、フレーム(HoudiniのFPS)、サンプル(CHOPのサンプルレート)の単位で持続する遅延の時間の長さを指定することができます。
Note
Unitsパラメータを変更する時、既存のパラメータを新しい単位に変換しません。
Time Slice
Time Sliceはクッキングパフォーマンスを良くしメモリ使用量を少なくする機能です。慣例上、CHOPは全体のフレーム範囲のチャンネルを計算します。チャンネルをフレーム毎に評価する必要がないなら、全体のチャンネル範囲をクッキングするのは不必要です。必要なチャンネルの部分だけを計算するほうが効率的です。この部分のことを Time Slice と呼びます。
Unload
CHOPで使われるメモリをそのCHOPのクックが終わったあとにリリースして、次のCHOPにデータを渡します。
Export Prefix
Export Prefix をCHOPチャンネル名の頭に追加することで、エクスポートする場所を決めることができます。
例えば、CHOPチャンネル名がgeo1:tx
で、プリフィックスが/obj
なら、チャンネルは、/obj/geo1/tx
にエクスポートされます。
Note
Export Prefix を空白のままにすることができますが、CHOPトラック名をobj:geo1:tx
のように絶対パスの名前にする必要があります。
Graph Color
すべてのCHOPには、このオプションがあります。各CHOPにはグラフ表示用のデフォルトのカラーが割り当てられますが、 Graph Color を使ってそのカラーを上書きすることができます。Paletteには36個のRGBカラーの組み合わせがあります。
Graph Color Step
グラフがアニメーションカーブを表示し、CHOPに2つ以上のチャンネルがある時、これは、虹色のカラースペクトルを指定して、あるチャンネルから次のチャンネルへカラーを別のカラーに定義します。
See also |