Jul 11, 2016

Houdini | VEX Introduction





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;

@Cd = hsvtorgb(@HSV);




③ radians, degrees : 角度

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);

v@sss;
@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