Wrangle + SolverSOP로 아이비를 포복

6566 단어 WrangleHOUDINI
SolverSOP와 wrangle을 사용하여 아이비가 성장하는 메커니즘을 만들려고합니다.
샘플 파일은 여기입니다.

wrangle 50 줄 정도로 만들 수 있기 때문에
차례로 설명해 나가려고 합니다.
(wrangle 이외의 노드가 나오지 않기 때문에 사람에 따라서는 지루할지도 모릅니다..)

STEP1. 면과 평행하게 진행하는 벡터 만들기



우선, 아이비가 늘어날 때 근처의 오브젝트의 형상을 따르도록 하고 싶습니다.
이것은
1, 근처의 물체의 법선 N을 데리러
2, 법선과 아이비 성장의 두 벡터를 사용하여 평면과 평행 한 벡터를 찾습니다.
의 2 공정으로 할 수 있습니다.

wrangle로하면 이렇게됩니다.
// run over points
int prm;
vector uv;
xyzdist(1, @P, prm, uv);
vector N = primuv(1, "N", prm, uv);

xyzdist()로 가까운 프리미티브 번호, UV를 얻을 수 있기 때문에
그것을 사용하여 primuv ()에 필요한 속성을 선택합니다.

법선을 알면 다음과 같이 cross를 두 번 사용하여 평행한 벡터를 구합니다.

vector v = cross(v@N ,cross(v@D, v@N)) * f@speed; // speed(移動量)は別で

이것을 SolverSOP로 반복 처리하면 이런 움직임을 만들 수 있습니다.


* 곤충처럼 되어 버렸습니다 · · 서투른 분 죄송합니다

STEP2. 라인이 늘어나게 한다



물체를 따라 움직임을 만들 수 있기 때문에
라인이 생성되도록 해 봅시다.

이쪽은
1, 마지막으로 만든 정점을 얻는다.
2, addpoint(), addverterx()로 정점을 늘린다
의 2 공정으로 할 수 있습니다

1 부분이지만, 이번에는 루프를 point가 아닌 primitive로 돌리기 때문에
primitive 루프 내부에서 포인트를 얻기 위해
primpoints()를 사용합니다.

이런 느낌에 쓴다
// run over primitives
//  現在のプリミティブの一番新しい点を拾う
int prim_pts[] = primpoints(0, @primnum);
int last_pt  = prim_pts[-1];
vector last_pos = point(0, "P", last_pt);
vector last_v = point(0, "v",last_pt);

// 点に一番近い面のNを拾い、平行なベクトルを求める
int near_prm;
vector near_uv;
xyzdist(1, last_pos, near_prm, near_uv);
vector near_n = primuv(1, "N", near_prm, near_uv);
vector near_pos = primuv(1, "P", near_prm, near_uv);
vector next_v = cross(near_n,cross(last_v, near_n));

// 新たな点を追加し、次のループ用にvを与えておく
vector next_pos = near_pos + normalize(next_v) * f@speed;
int next_pt = addpoint(0,next_pos);
addvertex(0, @primnum, next_pt);
setpointattrib(0, "v",next_pt, next_v, "set");

addpoint~의 흐름은 설명하고 있는 분도 많으므로 생략합니다.

이쪽도 SolverSOP에 짜넣으면, 이런 느낌이 됩니다



이제 이것으로 기본은 할 수 있었습니다.

그리고는 아이비처럼 하기 위해서 어레인지해 갈 뿐입니다.

아이비 같은



지금의 상태에서는, 최초로 정한 방향으로부터 똑바로 늘어나 버리므로
진행 방향으로 흔들림을 갖게 하기로 합니다

STEP3. 벡터 회전 흔들리게 한다고해도, rand나 noise로 만든 벡터를 가산해 버리면 면과 평행하지 않게 되거나 이동량이 바뀌어 버립니다. 이번에는 둘 다 무너지고 싶지 않기 때문에 N을 축으로 한 quaternion으로 회전(qrotate)시키도록 하겠습니다. wrangle은 이런 느낌 float rad = radians(chf("rot")); // 조정 파라미터 float rot_amount = fit01(rand(last_pt), -rad, rad); vector4 rotate_q = quaternion(rot_amount, near_n); next_v = qrotate(rotate_q, next_v); 이렇게하면 평행을 유지하면서 흔들리면서 진행됩니다. -10~10도 ~40~40도 STEP4. 지정한 방향으로 대략 맞추도록 한다 아이비 같아요. 이대로는 노린 형상으로 하는 것이 어렵고, 영상 제작에는 사용할 수 없을 것입니다. 그러므로 대략적인 성장 방향을 정의해 두고 그에 따라 진행하도록 합니다. 여기서 사용하는 것은 dihedral과 slerp입니다. 1, dihedral로 현재의 진행 방향이 전체의 진행 방향과 맞추기 위해서 필요한 회전량을 구 2, slerp로 필요한 회전량을 조절한다 의 2 공정입니다 이런 느낌에 쓴다 vector4 q1 = quaternion(set(0,0,0)); // 무회전 vector4 q2 = dihedral(v@v, v@global_v); vector4 quat = slerp( q1, q2, chf("bias")); // bias는 조정 파라미터 v@v = qrotate(quat, v@v); 빨강 = global_v 노란색 = v bias를 0에서 1로 애니메이션하는 모습 이쪽도 SolverSOP에 도입해 보겠습니다. bias = 0.5 이제 대략 의도한 방향으로 성장시킬 수 있게 되었습니다. STEP5. 분기하도록 한다 아이비처럼 보이기 위해 조금 더 손을 추가합니다. 이번에는 일정 간격으로 새로 아이비가 자랍니다. 이것은 매우 간단한 절차로 할 수 있습니다. 1. 일정 간격으로 addprim하여 초기 방향(v)을 주어 둔다 뿐입니다. 루프가 primitive 기반이기 때문에 새 primitive가 추가되면 다음 루프에서 동일한 처리가 적용됩니다. 즉, 여기까지 사용하고 있는 파라미터는 v 뿐이므로, v조차 주면 마음대로 뻗어갑니다. 그 v의 값이지만 아이비처럼 보이기 위해 처음에는 진행 방향에 수직(-90 or +90)이 되도록 하고 싶습니다. 이것은 진행 방향과 N의 cross를 찾아 -1 또는 +1로 곱하는 것뿐입니다만 -1이나 +1을 간단하게 만드는 방법을 몰랐기 때문에 우선 이렇게 했습니다 rint (rand ( @ptnum
* 뭔가 좋은 방법이 있으면 알려주세요 · ·

우선, 함께 쓰면 이런 느낌입니다.
int sub_pt = addpoint(0, near_pos);
addvertex(0, new_prim,sub_pt);                  
float sub_direction_flg = rint(rand(last_pt))*2-1;
vector sub_direction = cross(normalize(next_v), near_n);
sub_direction = sub_direction * sub_direction_flg;

setpointattrib(0,"v",sub_pt, sub_direction,"set");

좌우로 랜덤 정리하면 이런 느낌 STEP6. 기타 우선 이런 느낌으로 대체로 아이비 같아졌습니까? 설명을 위해 꽤 간단한 제작을 시도했습니다. 툴링한다면 여전히 기능을 원한다고 생각합니다. 예를 들어 i@isgrow 등으로 플래그를 지정하여 성장이 멈추도록 하자 f @ age를 만들고 성장하는 동안 카운트하려고합니다. f@width = clamp(f@age * 0.05, 0.1, 1.0) 굵기가 0.1에서 최대 1까지 자라면 면의 N을 v@N으로 포인트에 갖게 해 두어 v@P+= v@N*f@width 에서 물체에서 조금 멀어지거나 잎을 낳는다 (광합성의 효율이 좋도록, 겹치지 않도록 한다) 잎이 흔들리는, 담쟁이가되는 역학 요소도 넣고 싶습니다. 이번에는 전부를 해설 할 수 없었습니다. 샘플 파일내에서 몇개인가 구현해 두었으므로, 흥미가 있으면 참고로 해 주세요. 물론 다양한 글쓰기가 있다고 생각하기 때문에 더 빠르고 똑똑한 방법이 떠오르면 시도해보십시오. houdini는 wrangle 쓰고 바삭바삭하게 그림이 되는 것이 즐겁네요. 이상 「희귀한 노드의 사용법」같은 소개를 할 수 없어, 현인에게는 지루했을지도 모릅니다만 기회가 있으면 그러한 기사도 쓰고 싶습니다.

좋은 웹페이지 즐겨찾기