VEX入門のまとめ。
http://www.sidefx.com/docs/houdini15.5/vex/snippets
ここでVEXの基本事項を確認すること。
[ 扱えるアトリビュートとVEXタイプ]
vector : @P, @accel, @center, @dPdx, @dPdy, @dPdz, @Cd, @N, @scale, @force, @rest, @torque, @up, @uv, @v
vector4 : @backtrack, @orient, @rot
int : @id, @ix, @iy, @iz, @nexid, @pastate, @resx, @rexy, @resz, @ptnum, @vtxnum, @primnum, @numpt, @numvtx, @numprim, @group_*
string : @name, @instance
[ データ作成 ]
float name, vector name などアトリビュートを作らないことで作業を軽くすること。
vector @mine = { 0, 0, 0 }; → mineというvectorのアトリビュートが作成される。
f@myScale = 0; → myScaleというfloatのアトリビュートが作成され0が入力される。
@P *= @myScale; → @P = @P * @myScaleと同様の意味をもつ。
i[ ]@abc = {2, 4, 6, 9, 22, 31, 45}; リストの作成。
[ データ型 ]
float : 実数
12.3456, 123,456
int : 整数
1, 123, 12345
vector : { float, float, float } x,y,z rgb
vector2 : { float, float }
vector4 : { float, float, float, float }
matrix : { vector, vector, vector, vector }
string : 文字列、配列
float x, float y
vector A
[ドット入力]
vector @mine = { 0, 0, 0 };
@mine.x = 1;
@mine.r = 1; でもOK
これで xに1が入力され { 1, 0, 0 }となる。
float @myScale = `chs("myScale")`;
@P.y = sin(@ptnum) * @myScale;
[ オペレータータイプ ]
四則演算 : +, -, *, /, %,
代入 : =
加算代入 : +=
@P +=3;
@P = @P + 3; と同じ結果。
例)
v@sss = {2,3,4};
@sss.x += 3; 結果として{ 5, 3, 4 }となる。
v@vvv += 3; { 3, 3, 3 }の値を持つvectorのアトリビュートを作成。
減算代入 : -=
乗算代入 : *=
除算代入 : /=
余り代入 : %=
[ アトリビュートの使用と基本的な流れ ]
① f@a; i@b, v@c
それぞれ、float a, integer b, vector c どういうデータの型かを決めてデータを作成する。
これが基本となる。
② a = 1.0; b = 20; c = { 1.0, 2.0, 3.0 }
用意した型に任意の数値を入力する。
③用意した型をオペレータで計算する。
i@a = 10;
i@b = 3 ;
f@c = @a/@b; 結果として3.0
f@a = 10;
f@b = 3 ;
f@c = @a/@b; 結果として3.333333
f@a = 10;
f@b = 3 ;
i@c = @a/@b; 結果として3
[ 独自ファンクション ] :
返しの型 Fanction Name (引数型 引数名;引数型 引数名)
{
return ;
}
int abc(int a; int b)
{
return a + b - 5;
}
i@id = abc(10 , 15);
[ Function : 関数 ]
①切り捨て、切り上げ、四捨五入
- ceil : 切り上げ
- floor : 切り下げ
- rint : 四捨五入
f@sss = 5.55;
ceil(@sss); → 6
floor(@sss); → 5
rint(@sss); → 6
②RGB変換
- rgbtohsv : RGBからHSVに変換
- hsvtorgb : HSVからRGBに変換
v@HSV;
@HSV.x = @Frame * 0.01;
@HSV.y = 0;
@HSV.z = 0;
radian : degreeをradianに変換
degree : radianをdegreeに変換
v@sss;
@sss.x = sin(radians(90)); →1.0に変換される。
④ power : 累乗 power(float, float);
pow(2.0, 4.0); →2の4乗で16が計算される。
⑤ square root : ルート sqrt(float);
f@sss = sqrt(4.0); →√4だから2が返される。
⑥ average : 平均 avg();
avg(vector);
avg(float, float);
avg(vector, vector);
avg(vector4, vector4);
@sss.x = avg(1.56, 2.8242, 4.9152, 156.177); →平均値が返される。
⑦ max, min : 最大最小
max(vector);
max(float, float);
max(vector, vector);
max(vector4, vector4);
min(vector);
min(float, float);
min(vector, vector);
min(vector4, vector4);
v@sss;
@sss.x = max(1.526, 2.8278, 4.9156, 256.122); →最大値25.122が返される。
@sss.x = min(1.526, 2.8278, 4.9156, 256.122); →最小値1.526が返される。
⑧ 三角関数
サイン : sin
sin(float);
sin(vector);
sin(vector4);
コサイン : cos
cos(float);
cos(vector);
cos(vector4);
タンジェント : tan
tan(float);
tan(vector);
tan(vector4);
アークサイン : asin
atan(float);
atan(vector);
atan(vector4);
アークコサイン : acos
acos(float);
acos(vector);
acos(vector4);
アークタンジェント : atan 2辺の長さから角度を求める際に使う。
atan(float);
atan(vector);
atan(vector4);
ハイパーボリックサイン : sinh
sinh(float);
sinh(vector);
sinh(vector4);
ハイパーボリックコサイン : cosh
cosh(float);
cosh(vector);
cosh(vector4);
ハイパーボリックタンジェント : tanh
tanh(float);
tanh(vector);
tanh(vector4);
f@myScale = `chs("myScale")`;
@P.y = sin(@ptnum * @Flame * 0.01) * @myScale;
⑧ fit : レンジマッパー : ある範囲の数値を指定範囲の数値に変更する。
fit(fit value, float omin, float omax, float nmin, float nmax);
fit(vector value, vector omin, vector omax, vector nmin, vector nmax);
fit(vector4 value, vector4 omin, vector4 omax, vector4 nmin, vector4 omax);
@P.x = fit(rand(@ptnum), 0, 1, -1, 1); 0,1の範囲が-1,1の範囲に変更された。
⑨ fit01(0~1), fit10(1~0), fit11(-1~1) : fit簡易版
fit01(float value, float nmin, float nmax);
fit01(vector value, vector nmin, vector nmax);
fit01(vector value, vector nmin, vector nmax);
@P.x = fit(rand(@ptnum), -1, 1); 0,1の範囲が-1,1の範囲に変更された。
⑩ clamp : 指定した範囲内に数値を収める。: 最小値、最大値を指定しその範囲に収める。範囲を超えたものは切り捨てる。
clamp(int value, int min, int max);
clamp(float value, float min, float max);
clamp(vector value, vector min, vector max);
clamp(vector4 value, vector4 min, vector4 max);
v@sss = {-15.5, 30, -8};
@sss = clamp(@sss, {-10, 0, -10}, {10, 5, 10}); →Clampされて { -10, 5, -8 }というvectorになった。
⑪ rand : ランダム数値 : 0~1のランダム数値, seedが同じであれば結果も同じになる。
rand(float seed);
rand(float seed1, floatseed2);
rand(vector);
rand(vector4);
などかなりの種類がある。
f@sss;
@sss = rand(20);
v@sss;
@sss = rand(@ptnum);
v@sss;
@sss = rand(20);
v@sss;
@sss = rand({1.25, 2.25, 3.211});
⑫ npoints : ポイント総数の取得 : int npoints(int input_number);
i@total = npoints(0); →0のインプットのポイントの総数を取得。
⑬ getbbox : バウンディングボックスの取得 : 最小最大のベクターの取得
getbbox(vector min&, vector max&);
getbbox(int input, vector min&, vector max&);
getbbox(int input, string primgroup, vector min&, vector max&);
getbbox(string filename, string primgroup, vector min&, vector max&);
box 1,1,1とattribute wrangleを繋げて
v@min;
v@max;
getbbox(@min, @max); →最小最大のベクターを取得できる。
@min,@maxという引数となる変数を作るのがポイントとなる。
⑭ if : if文 : 分岐処理
if (条件)
{
処理
}
if(@ptnum % 4)
{
@P.y += 0.5;
}
⑮ if else :
if (条件)
{
処理
}
else
{
処理
}
if(@ptnum % 4){
@P.y += 0.5;
@Cd = {1.0, 0.0, 0.0};
}
else{
@P.z += 1.0;
@Cd = {0.0, 0.0, 1.0};
}
⑯ else if : else ifはいくつでも追加可能。
if (条件)
{
処理
}
else if(条件)
{
処理
}
else
{
処理
}
if((@ptnum % 3) == 0)
{
@Cd = {1.0, 0.0, 0.0};
@P.y += 0.2;
}
else if((@ptnum % 3) == 1)
{
@Cd = {0.0, 1.0, 0.0};
@P.y += 0.4;
}
else
{
@Cd = {0.0, 0.0, 1.0};
}
⑰ while loop : ループ処理, 無限ループにならないように気を付ける。
while (条件)
{
処理
}
i@a = 0;
i@b = 0;
while( @a < 10 )
{
@b += @a;
@a ++;
}
⑱ do while loop : 条件判定が後に来るため必ず1度実行される。
do
{
処理
} while (条件);
i@a = 0;
i@b = 0;
do
{
@b += @a;
@a ++;
} while( @a < 10 );
⑲ for loop :
for (初期化 ; 条件 ; 変化)
{
処理
}
i@b = 0;
for(i@a=0; @a < 30; @a++)
{
@b = @b + @a;
}
⑳ foreach loop : 配列の処理などで使用する。valueでなくても名前はなんでもよい。
for (value; array)
{
処理
}
i@a = 0;
i[ ]@abc = {2, 4, 6, 9, 22, 31, 45};
@abc[2] = 100;
foreach(i@value; @abc)
{
@a += @value;
}
@aにリストの加算の合計が返される。
㉑ normalize : 正規化 : 長さを1にする。
normalize(vector);
v@sss;
@sss = {2.0,5.0,6.0};
v@mv = normalize(@sss);
㉒ length : 原点からの長さを求める。
length(vector);
length(vector4);
v@sss;
@sss = length({2.0,5.0,6.0});
㉓ abs : 絶対値 : マイナスの場合はプラスに
abs(int);
abs(float);
abs(vector2);
abs(vector);
abs(vector4);
㉔ neighbourcount : 隣接するポイント数を取得
neighbourcount(int inputnum, int ptnm);
neighbourconnt(string filename, int ptnum);
i@sss;
@sss = neighbourcount(0, @ptnum); →ポイントごとに隣接するポイント数を割り出し。
㉕ neighbour : 隣接したポイント番号の取得
neighbours : 配列で取得する関数もある
neighbour(int inputnum, int ptnum, int neighbournum);
neighbour(string filename, int ptnum, int neighbournum);
i[ ]@sss;
@sss = neighbours(0,@ptnum); →ポイントごとに隣接するポイント番号を割り出し。
㉖ noise : ノイズを加える : randとは異質の連続性のあるノイズ
@P.y = noise(@P) * `chs("myScale")`;
㉗ pnoise : perlin style noise
vector sss = chv("noise");
float ddd = chf("myScale");
@P.y = pnoise(@P, sss) * ddd;
No comments:
Post a Comment