最初に思っていた方法では無いけど、Packしてパーティクル扱いすれば簡単にできた。
違う方法も模索中
@elemnum
現行エレメントの番号。
@numelem
現行ジオメトリ/リスト内のエレメントの総数。
@ptnum
現行ポイントのポイント番号。
@primnum
現行プリミティブのプリミティブ番号。
@vtxnum
現行頂点の頂点番号。スニペットで頂点をループさせる時に使用します。 ポイントでループさせた場合、これは、そのポイントに接続されている頂点です。頂点が存在しなかった場合は-1です。 そのポイントが2つ以上の頂点に接続されている場合、どちらかの頂点が任意で返されます。 プリミティブでループさせた場合、これは、そのプリミティブの0番目の頂点です。
@numpt
現行ジオメトリ内のポイントの総数。
@numprim
現行ジオメトリ内のプリミティブの総数。
@vtxnum
線形頂点番号 。
この頂点が属するプリミティブのプリミティブ番号は@primnum
です。 任意の線形頂点番号が属するプリミティブ番号を取得するには、vertexprimを使用します。 線形頂点番号をその頂点が属するプリミティブ内の頂点インデックスに変換するには、vertexprimindexを使用します。 頂点をループさせる時、現行プリミティブ内の頂点の総数は@numvtx
です。 任意のプリミティブ上の頂点の総数を取得するには、そのプリミティブ番号を使ってprimvertexcountをコールします。
例えば、ポリカーブの頂点のVertexアトリビュートにカーブ沿いに比例した値を設定したいのであれば、以下のコードを書きます:
# 線形頂点番号を取得して、それをプリミティブインデックスに変換します。 int vtx = vertexprimindex(0, @vtxnum) # 頂点番号を最後のインデックスで除算することで、 # ポリカーブ長に沿った0.0から1.0までの範囲の値をアトリビュートに設定します。 f@prop = vtx / (float(@numvtx) - 1)
@numvtx
現行プリミティブ内の頂点の数。
@Time
Floatの時間($T
)
@Frame
Floatのフレーム($FF
)
@SimTime
Floatのシミュレーション時間($ST
)で、DOPコンテキストにのみ存在します。
@SimFrame
Floatのシミュレーションフレーム($SF
)で、DOPコンテキストにのみ存在します。
attribwrangle1内コード
vector targ_pos = minpos(1,@P);
v@minpos_v = targ_pos-@P;
int pid = addpoint(0, targ_pos);
addprim(0,”polyline”, @ptnum, pid);
addprimについて
int addprim(int geohandle, string type, int pt0, int pt1)
int addprim(int geohandle, string type, int pt0, int pt1, int pt2, int pt3)
int addprim(int geohandle, string type, int points[])
…
types:: “poly”, “polyline”,……
minposを使ったSample
宣言
i[]@i_val;
f[]@f_val;
v[]@v_val;
int i_val[];
float f_val[];
vector v_val[];
配列に追加
append(@f_val, val);
以下のように返り値を直接入れられない場合
append(@v_val, point(0,”P”,i));
キャストしよう
append(@v_val, vector(point(0,”P”,i)));
追記 2021/12/15
代入
v@Cd = set(1,0,0);
reference
Array Controlled Animation in Houdini – YouTube