FX/Houdini_Joy of VEX

Joy of Vex - Day 16: copy sop, midweight instance attributes (scale, N)

Gamestonk118 2022. 7. 24. 00:16

중요했던 부분:

- Copy to Points 노드로 geometry들을 연결할때 어떠한 기준으로 geometry의 방향이 정해지는가?

add node로 포인트들 만들어주고 copy to points로 해당 포인트의 위치에 특정 Geometry를 카피하도록 설정하였을때 geometry는 그 점에서 어떠한 방향을 취하게 된다. 이는 copy to points 1번 인풋에 연결된 point의 노멀값에 따라 지정되도록 설계되었기 때문이다.

만일 이렇게 연결된 상황이 있다 가정했을때 결과로는 아래와 같은 결과를 나타낸다.
이는 add노드로 만들어진 포인트에 Normal값을 갖지 않았기 때문이다.

그치만 위의 예시와는 다르게 grid같이 normal값을 가진 geometry를 구성하는 점들에 특정 geometry를 카피시키기 위해 copy to points를 이용한다면 grid의 모든 포인트의 노멀값이 {0, 1, 0}으로 구성되어있기 때문에 이렇게 y값을 향한 방향으로 보이게 되는 현상을 나타낸다.

이와 같이 rubbertoy가 grid를 구성하는 포인트들의 노멀값과 동일하게 y값만을 향하는 방향을 갖게되어 전부다 배까고 드러누운것을 볼 수 있다.

- @up

@up은 attribute들중 하나로써 geometry의 머리의 방향을 결정해주는 vector attribute로써 머리부분이 어느 위치를 향할지 알려준다.

만일 이렇게 노드가 연결되게끔 세팅하였을때 wrangle 노드안에 아래와 같은 코드를 작성하였다.

/* vector attribute dir을 모든 포인트들의 위치로 설정하였다. 이는 또 원점으로부터 모든 포인트
까지의 방향값을 나타내기도 한다.*/
v@dir = @P; 
// 위에서 구한 값을 normalize()으로 크기값을 1로 설정하여 vector attribute normDir에 저장하였다
v@normDir = normalize (@dir);
/* Normal값이 y값으로 1로 설정되었다. 그러므로 rubbertoy의 머리의 방향과 관계 없이 전체적인 방향은 y값으로 
정면을 향하게 만들어 배까고 드러눕도록 설정하였다*/
@N = {0, 1, 0};
// 1번 인풋 geometry혹은 Wrangle노드에서 0번 포인트의 @normDir값을 불러와 vector attribute get에 저장
vector get = point (1, "normDir", 0);
// 방금전 불러온 vector variable get값을 @up으로 지정하여 geometry의 머리 방향을 결정해주었다.
// 이는 만약 내가 (1, 2, 0)의 위치에 포인트를 생성했다면 rubbertoy의 머리 방향이 그쪽으로 쏠려있을것이람을 의미한다
// 머리 방향이 특정 포인트로 지정되었다해도 전체적인 몸통의 방향값은 (0, 1, 0) y방향으로 유지된다
@up = get;

나는 좀더 동적인 모션을 구축해보기 위해 아래와 같이 첫번째 wrangle노드가 연결된 add노드 안에 포인트의 x과 z값에 이러한 식을 써넣어두었다.

이와 같이 $F 프레임값이 올라갈수록 포인트의 위치가 바뀌게 되는 수식을 써넣어 모션을 구축해보았다.

rubbertoy가 포인트의 노멀값에 따라 위를 향한체 @up에 대한 값들이 원운동을 하여 누워서 배까고 빙글빙글 도는 것을 알 수 있다.

- Select -> Select Points/Primitives -> Edit (E) -> Transform

이 방법으로 통해 geometry의 특정 point나 primitive의 위치/방향/ 그리고 스케일값을 조절시킬 수 있고 아래와 같은 특정 geometry에서 변형된 모양을 가질 수 있다.

box geometry에서 위와 같은 방법으로 한 primitive의 scale값을 조절하여 이렇게 특이한 모양을 가진 geometry를 만들어보았다.

이때 이러한 방법으로 생성하면 저절로 geometry 노드 아래 edit 노드가 연결되는데 이 노드를 그냥 남겨두면 scene view에서 선택한 포인트 혹은 프리미티브가 노란색으로 띄게 남겨진다. 이는 노드 정보에서 볼수 있듯이 highlighted points/primitives가 적혀있기 때문인데 이를 없애기 위해 아무것도 적용이 되지 않된 edit노드를 한번 더 연결해준뒤 null 노드를 연결하면 사라지는 것을 알 수 있다.

이와 같이 highilighted points같은 표시가 노드 정보에 표시되기 때문에 scene view에서 거슬리게 노란색이 띄는 것이다.
이와 같이 노드 구조를 세팅해주면 더이상 거슬리는 노란색 이 띄지 않는 것을 확인할수 있다.

- copy to points를 이용한 특정한 모션만들어보기

우선 첫번째로 copy to points를 활용하여 방금 위에 만들어 본 box를 여러개 나타나게끔 해보기 위해 이러한 방식으로 노드를 구성해보았다.

이러한 방식으로 노드를 꾸며보야 grid를 구성하는 모든 포인트에 해당 box가 모두 위치할 수 있게 끔하였다.

우선 첫번째 box에 연결된 wrangle에 이러한 코드를 써넣어 box의 프리미티브에 특정 방향에 따른 색상을 지정할 수 있게끔 하였다.

// @N값에 따라 box의 면들의 색상이 정해질 수 있도록 run over를 프리미티브로 설정하였다
@Cd = @N; // 위에서 상기했듯이 프리미티브의 노멀값에 따른 컬러값을 지정해주어 띄게 만들었다.

/* 이때 @Cd = @N 이렇게 지정해서 각기 box의 면에 색을 입혀주었ㅇ르때 반대의 방향으로 향하고 있는 면들은 
(-1, 0, 0), (0, -1, 0), (0, 0, -1) 이와 같이 음수의 값으로 지정되게끔 설정하였다*/
if (min(@Cd) < 0) { // 만약 vector attribute @Cd값들중 가장 작은 값이 0보다 작다면
    @Cd = 0.1; // 그에 해당하는 프리미티브는 색을 0.1로 정하도록 설정하였다
}

그 다음 위에서 상기했듯이 edit으로 box의 모양을 특정하게 바꾸어 그 모양 그대로 포인트에 카피되게끔 하였다.

그다음 grid에서 normal 노드를 붙여 포인트로부터 normal방향이 지정되게끔 바꿔준 다음 wrangle 노드를 붙였다. 그다음 또 다른 add로 만든 포인트 노드를 동일한 wrangle 노드의 1번 인풋으로 연결하여 box의 머리 방향에 변화를 주게끔 하였다.

wrangle노드에 따로 연결한 add노드에서 포인트를 하나 생성해 sin()과 cos()를 써넣어 프레임이 올라감에 따라 원운동을 하게끔 설정하였다

/* vector Attribute up을 1번 인풋으로 연결된 0번 포인트의 위치값으로 설정하여 앞서 말했듯이 box의 머리방향을 
직접 지정해 아까 만들었던 add로 생성된 포인트를 따라 머리 방향이 원운동하게끔 설정하였다*/
v@up = point (1, "P", 0); 
@pscale = 0.6; // @pscale값을 0.6으로 줄여주어 전체적인 box의 uniform scale을 줄여주었다

 

Grid를 구성하는 포인트의 노멀값에 따라 geometry가 전부 누워있는 상태에서 @up으로 인해 빙글빙글 원운동을 하는 것을 볼 수 있다.
float t = @Time; // @Time을 float variable t에 저장하였다
/* 방금 생성한 @Time을 가지고 있는 float variable t에 @ptnum을 더해 grid를 구성하는 포인트 넘버가 높을수록 
나중 식을 통해 더 먼저 돌아가도록 설정하였다. 그리고 chf()으로 생성된 offset 파라미터를 곱하여 정도를 유저가
조절할 수 있게 하였다*/
t += @ptnum*chf ("OFFSET");
/* v@up을 통해 시간이 흐름에따라 box가 원운동을 할 수 있게끔 세팅해주었다. 이는 기존에 wrangle 1번 인풋에 연결된
add노드가 이번엔 없기때문에 따로 이렇게 작성해두었다*/
v@up = set (sin (t), 0, cos (t));

 

모션을 꾸며주어 높은 @ptnum값을 가진 grid의 point에 위치한 Geometry일 수록 더욱 먼저 빨리 원운동을 하도록 설정해주었다.

이번에는 돌아가는 것에다가 grid에 sin()파형까지 추가하여 돌아가면서 grid의 형상을 가진 box더미들이 출렁이게 만들어 화려한 모션을 만들어 보았다. 기존 동일한 노드 구성에 방금전 만든 vex를 이렇게 수정하여 다음과 같은 애니메이션을 만들어보았다.

float d = length (@P); // 원점으로부터 모든 포인트의 위치까지의 거리를 float variable d에 저장
// @Time을 float variable t에 저장하고 chf()을 곱하므로써 스피드를 파라미터로 조절가능케함
float t = @Time * chf ("SPEED");
// t값에 d를 더하여 원점으로 멀어질수록 시간이 지날수록 아래식에 따라 더 원운동을 먼저하게끔 설정
// 그리고 chf()을 더함으로써 먼저하는 정도를 파라미터로 조절가능케함
/* v@up을 통해 시간이 흐름에따라 box의 머릿부분이 원운동을 할 수 있게끔 세팅해주었다.*/
t += d*chf ("OFFSET"); 
v@up = set (sin (t), 0, cos (t));
// sin파형을 가진 t값을 높이값으로 주어 출렁거리는 효과를 나타냈다
// 그리고 t에 2를 곱해 frequency값을 늘렸고 파형식 자체에 0.5를 곱해 amplitude값을 낮추었다
@P.y = @P.y + sin (t*2)*0.5;

 

grid에 sine파형을 주어 출렁거리는 효과와 @up을 통해 geometry가 돌아가는 효과를 동시에 적용하여 이와같은 모션을 만들었다.

Exercises:

1. Balls in a line that bounce one after the other (hint: use a line as your template geometry, and use a chramp to draw in a small bounce curve in with a long flat area to either side of it)

우선 아래와 같은 식으로 이렇게 노드를 구성하여 sphere을 모든 라인의 포인트에 copy to points을 활용하여 카피하여 모션을 주기로 하였다. 그리고 라인에 힌트에 나와있듯이 chramp()을 활용하여 바운스 모션을 만들어 선이 어떻게든 움직이게끔 만들어 보았다.

나는 이렇게 노드들을 구성하여 공이 차례대로 바운스되는 모션을 만들어보았다.

그리고 이러한 코드를 작성하고 chramp()의 파형모양을 설정해주어 바운스되는 모션을 만들어보았다.

// float variable fx를 선언하면서 효과를 누적시켜줄 변수를 만들어 줌
float fx = 0;

float x = @P.x; // 모든 포인트의 x위치값을 Float variable x에 저장
x *= chf ("FREQ"); // ramp파형을 누적시켜줄 float variable x값에 chf()을 곱하여 frequency를 조절
 // ramp파형을 누적시켜줄 float variable x값에 @Time을 더하여 모션을 추가
 // 그리고 chf()을 곱해주어 스피드를 파라미터로 조절가능케함
x -= @Time*chf ("SPEED");
fx = chramp ("RAMP", x); // x값에 ramp파형을 적용시키게 해 특정한 수치의 변화를 주게끔 만듬
fx *= chf ("AMP"); // 파형값에 chf()값을 곱해주어 amplitude를 조절가능케함

// 만들어진 모든 효과를 @P.y 높이값으로 보여주게 만듬
@P.y = fx;
@pscale = chf ("PSCALE"); // @pscale값을 파라미터로 조절해 uniform scale을 조절가능케함

chramp()로 만들어진 ramp interface에 ramp를 이러한 모양으로 설정하여 엄청 높이 뛰게끔 만들어보았다

각기 sphere가 ramp 파형에 맞게 꾸며진 line의 모션을 따라 마치 차례대로 바운스 되는 애니메이션을 만들어 보았다.
생각해보니 바운스되는 모션은 위에서 떨어지는 것이라 효과 Fx값에 - 마이너스를 추가하고 transform으로 위로 올려서 이러한 모션을 만들어보았다.

2. As above, but shapes that bounce in a circle

우선 기존에 있던 sop 방식에서 라인을 지우고 circle을 연결하여 똑같이 바운스 모션을 만들고자 하였다. 이때 @P.x값으로 라인을 구성했던 것처럼 @ptnum값으로 circle안의 있는 포인트들이 @ptnum의 변화의 맞게 모션이 생기도록 유도하여 @ptnum을 중심으로 코드를 작성하였다.

circle에 wrangle노드를 연결하여 새로운 쉐입의 애니메이션을 구성하였다

// float variable fx를 선언하면서 효과를 누적시켜줄 변수를 만들어 줌
float fx = 0;

// 모든 포인트의 포인트 넘버값을 float variable pt에 저장하여 포인트의 넘버가 늘어날 수록 바운스 되게끔 설정
float pt = @P.x;
pt *= chf ("FREQ"); // ramp파형을 누적시켜줄 float variable pt값에 chf()을 곱하여 frequency를 조절
 // ramp파형을 누적시켜줄 float variable pt값에 @Time을 더하여 모션을 추가
 // 그리고 chf()을 곱해주어 스피드를 파라미터로 조절가능케함
pt -= @Time*chf ("SPEED");
fx = chramp ("RAMP", pt); // pt값에 ramp파형을 적용시키게 해 특정한 수치의 변화를 주게끔 만듬
fx *= chf ("AMP"); // 파형값에 chf()값을 곱해주어 amplitude를 조절가능케함

// 만들어진 모든 효과를 @P.y 높이값으로 보여주게 만듬
@P.y = fx;
@pscale = chf ("PSCALE"); // @pscale값을 파라미터로 조절해 uniform scale을 조절가능케함

 

방금전 모션을 circle모양에 대입하여 circle모양에서 순서대로 바운스 되는 모션을 완성해 보았다.
아까와 마찬가지로 위에서 떨어져서 튕겨지는 모션도 완성해 보았다.
frequency값을 조절하여 하나하나 바운스되게 만듦

3. What happens if you use a transform sop to rotate and shift the template geometry? Does the copied geo stay consistent?

transform 노드를 wrangle 노드 아래 추가하여 rotate 하기도 하고 이동시키기도하고 스케일을 늘려보기도 하였는데 geometry의 방향과 위치는 물론 바뀌지만 카피된 Geometry의 쉐입에 직접적인 영향은 없다는 사실을 확인하였다. 이는 copy to points로 카피된 geometry는 오직 포인트의 위치에서 작동되기 때문이다.

위치를 막무가내로 바꾸어봤는데 모션자체는 제대로 작동되는 것을 확인 할 수 있다.

이해가 안되었던 부분:

- 2번 exercise를 어떻게 해야할 지 감이 잘 잡히지 않았지만 고도의 생각끝에 어떻게 하는지 알아낼 수 있었다. 그래서 그런지 오늘 강의는 많이 어려웠던 부분이 없었던 것 같다. 아마 @up의 방향과 포인트의 normal값이 둘다 적용되어 copy to points로 볼때 특정 방향을 향하는 Geometry에 대한 예측에 대한 연습을 더욱 해야겠다는 생각이 든다.

 

공부하면서 들었던 생각:

이번 강의는 생각보다 짧았고 어려웠던 내용도 없었던 것 같다. 근데 항상 불안한게 강의가 짧거나 생각보다 쉬우면 다음강의는 미치도록 어려웠던 것이 기억에 남는다. 아마 17일차 내용 joy of vex에서 가장 돌파하기 힘들다고 예상된다. 이번 copy to points에서 배웠던 @up과 포인트의 @normal에 따른 geometry의 방향은 지난 강의때 궁금했던 것을 정말 잘 설명해주었다는 생각이 든다. 이제 얼마 남지 않은 것을 보니 더욱 마음 단단하게 잡고 치고 나가야 겠다는 생각이든다. 솔직히 copy to points는 정말 재밌다고 생각이 든다. 하나의 쉐입모션을 만들어주고 그것을 이루는 포인트에 한 geometry를 카피한다는 것이 정말신기하기도 하고 재밌기도 하다. 다음 시간 쿼터니안 뭐시기 배운다는데 그것도 copy to points에 관련된 내용이라고 들었다. 그때부턴 아마 지금 까지 느꼈던 copy to points가 재밌다는 것을 잃고 싫어지게 될지 두렵다. 어서 빨리 17일차 포함 joy of vex과정 전부 다 돌파하고 후디니1 들으러 가고 싶다.