트위터



2018/06/25 22:56

후디니 Pyro stick to Surface 에 대한 VEX 해석 Houdini Memory



float sdf = volumesample(0,0,@P); //0번인풋의 0번째 볼륨(prim)에 대해서 @P를 불러옵니다. sdf의 경우 표면이 0, 표면밖이 0보다 큰값(양수), 표면 안쪽이 0보다 작은 값(음수)이 되어, 표면과 멀 수록 표면(0)과의 값의 차가 더욱 커집니다.
vector grad = volumegradient(0,0,@P); //0번인풋의 0번째 볼륨(prim)에 대하여 @P를 그라디언트(노말라이징)합니다. 이 경우 표면에서 바깥과 안쪽에서 각각 표면으로 향하는 최단거리방향의 벡터가 모두 동일하게 생성됩니다.

vector inforce = -sdf*grad*ch('to_surface_mult'); //float의 sdf의 역수값을, 노말라이징된 vector인 grad와 곱함으로써, 표면에서 부터의 거리가 멀 수록 보다 표면에서 멀어지는 큰 벡터가 되도록 하여, inforce라는 벡터로 설정합니다. (ch값으로 곱하는 값을 추가 생성)
@vel *= ch('curl_mult'); //기존에 만들어진 @vel (노말방향과 curlnoise(@P+@Time)을 crossproduct 된 벡터를 @vel로 앞서 사용했습니다) 에, 추가의 곱하는 채널값을 만들어둡니다
@vel = lerp(@vel, inforce, abs(sdf)); //@vel과 상단의 inforce vector 두 벡터값을 lerp하여 원하는 비율로 믹싱합니다. 믹싱의 비율은 상단의 sdf float의 절대값을 따릅니다 (lerp의 경우 최소최대 0-1까지만 영향받습니다)
//즉, 표면에서의 거리가 멀어질수록 1이되거나 1을 넘게되어 @vel은 없어지고 inforce의 비중이 커진채로 @vel에 새롭게 갱신됩니다. (=표면에서 멀 수록 표면밖으로 향하는 벡터가 됩니다)
//반대로 표면에서의 거리가 가까울수록 0과 가까워 지기때문에, 기존에 만들어둔 @vel의 비중이 커지게 됩니다. 다만 표면을 제외한 나머지 표면에 근접한 부분은 inforce의 비중이 상대적으로 상당히 작을 뿐 영향을 주긴 합니다. (=표면에 가까울수록 @P의 curlnoise와 표면의 노말이 crossproduct한 벡터가 됩니다)




@density = clamp(fit(abs(sdf),0,.05,1,0),0,.05); //밀도 @density는 표면에 가까울수록 1이되고 멀 수록(최대 0.05까지를) 0이 되도록 새롭게 매핑하지만, 이 값을 0과 0.05로 다시 제한(clamp)합니다
@density *= fit(noise(@P*ch('density_noise_freq')),0.2,1,0,ch('density')); //그런 뒤 밀도 @density 에는 @P의 noise값에 대하여 새롭게 매핑한 값을 다시 곱합니다.


//정리하자면 @vel 필드는 표면과의 거리에 따른 @P 기준의 curlnoise의 영향력이 각기 다르도록 조정하였고, 그 전에 생성될 @density 필드는 미리 노이즈를 준 채로 시뮬에 적용되도록 합니다.
//이하 단계는 pyro solver의 영향으로 이어지게 됩니다.




원문 링크


참고자료 링크




2018/06/20 16:06

후디니 Point by Point, VEX구문 해석 Houdini Memory


출처 : https://youtu.be/NQ-DBYlK20s

--

상당히 도움될 영상이 sideFX에서 업로드되었기에 
적당히 이해하기 위한 해석 메모문을 남겨놓는다.



//project first point
//포인트를 가장 가까운 지오메트리의 위치로 이동시킵니다. 이것은 첫 포인트 위치가 됩니다
vector minpos = minpos(1, @P);
@P = minpos;
vector currentpos = @P;

//setup initial variables
//진행방향의 축을 지정하고 새로운 프리미티브를 생성합니다
vector dir = chv("axis");
int newprim = addprim(0,"polyline");


for( int i=0; i < chi("number_of_points"); i++ ) {

//check N of closeST point to the currently processed point on surface
//옮겨진 포인트 위치에 있는 지오메트리에서 노말을 샘플링합니다
int closept = nearpoint(1, currentpos);
vector closeN = point(1, "N", closept);

//calculate new point position
//새롭게 생성될 포인트의 진행방향과 위치에 대한 조정값을 만듭니다
vector newpos = normalize(cross(closeN, dir + curlnoise(currentpos + i * 0.01) * ch("noise"))) * ch("stepsize"); 
//샘플링된 노말 + (진행방향의 축 + @P의 curl노이즈)

//reproject new point position onto surface
//조정된 새 포인트 위치를 다시 지오메트리와 가장 가까운 곳으로 이동시킵니다
vector projectpos = minpos(1, currentpos + newpos);
//프로젝션(지오메트리에 붙어진 첫 포인트위치 + 조정할 새 포인트 위치/방향 조정값)

//draw new point with layer offset
//새로운 포인트를 만듭니다. 포인트가 추가될수록 노말방향만큼 향하도록 추가도 합니다
int newpt = addpoint(0, projectpos + closeN * ch("offset") * 0.00001 * i);
addvertex(0, newprim, newpt);
//만든 포인트에 대한 버텍스(포인트)를 생성하여 프리미티브에 포함시킵니다

//set the new point to be the currentpos for next iteration
//첫 포인트위치를 새롭게 만들어진 포인트로 변경해두고 반복구문을 종료합니다.
currentpos = projectpos;
}





------------------



1. 커브를 그리고,  thiness 속성을 만듬
2. id속성을 만들고, 포인트를 프로젝션하고, 프로젝션으로 닿지않는 녀석들을 그룹짓는다.

vector ray_dir = {0, -100, 0};
vector hitpos;
float hit_u;
float hit_v;

i@intersect = intersect(1, @P, ray_dir, hitpos, hit_u, hit_v);

@P = hitpos;

if(i@intersect <0) {
@project = 0;
i@group_loose = 1;
} else {
@project = 1;
}



3. loose그룹에 대해서만 첫번째 포인트와 인접한 포인트에게 grow

float prev_pt = point(0, "project", @ptnum-1);
float next_pt = point(0, "project", @ptnum+1);

if(prev_pt = 1){
setpointattrib(0, "project", @ptnum - 1 , 0, "set");
setpointgroup(0, "loose", @ptnum - 1, 1, "set");
}

if(next_pt = 1){
setpointattrib(0, "project", @ptnum + 1 , 0, "set");
setpointgroup(0, "loose", @ptnum + 1, 1, "set");
}


4. loose 그룹들의 포인트들을 isolate 하고, 쭉 뻗은 직선으로 변환

vector start_pt = point(0, "P", 0);
vector end_pt = point(0 ."P", @numpt - 1);

vector delta = end_pt - start_pt;

@P = start_pt + delta / (@numpt - 1) * @ptnum;


5. 아크형태를 만든다

2018/06/14 12:20

후디니 lightning bolt (라이트닝 볼트, 전기) 이펙트 hip 파일 _v3 Houdini Memory

(이전 버전의 gif)


(새롭게 갱신한 버전의 gif)


전에 만들어 둔게 카메라 가까이 들어오면서 다시 쓸일이 생겨버렸기에
대폭 갱신하여 새로운 버전으로 재업로드

후디니 (houdini) hip 파일이며,
갈라지는 라인의 갯수나 길이, 굵기 방향 등을 조정할 수 있도록 노드가 더 덕지덕지 붙어버렸다.

자세한 내용은 트랙백된 링크( http://dsharp.egloos.com/4154548 )를 참고


Update Log
V3
 : point id를 불러오는 과정이 잘못된 항목이 있어 vex구문을 일부 수정했습니다.
 : 라인 갯수의 계산방식을 ceil에서 modulo 로 변경하였습니다.


HIP File (v3)




HIP File (v2)

1 2 3 4 5 6 7 8 9 10 다음