point rotation

이번 오픈 클래스 작업을 하다가 쓰게 된 방법 입니다. sop노드들로 간편히 하는 게 아니라, VOP SOP안에서만 문제를 다 해결하는 것인데, 좋은 정보가 될까 싶어서 올립니다. 혹시 이 보다 쉽고 간단한 방법이 있을지 모르겠는데, 배우는 입장에서 저로서는 이게 최선이었습니다. 이 문서에 오류가 있거나 더 좋은 방법이 있으시면 댓글로 알려 주시면 감사하겠습니다.

vop sop에서는  point를 조절해 sop를 변형 하는데, 이 point의 속성 값을 이용해야할 때가 종종 있습니다. vop sop에서 쉽게 이용할 수 있는 여러가지 속성들이 있는데,  뒤져봐도 pop에서 particle들에 속성을 자동으로 만들어 회전 시킬 수는 있으나 sop에서 point를 회전 시키는 기능이나 속성은 찾을 수가 없었습니다.

회전은 어떤 규칙을 갖고 있는 방향의 연속 인 것 같습니다. 포인트가 제자리에서 xz방향으로 원을 그리며 회전을 한다는 것은 각 방향을 계속해서 향한다는 것인데, velocity나 normal같은 벡터 값이 바로 이러한 방향을 나타냅니다.  그러나 normal값은 어떻게 이용하면 할 수도 있을 것 같은데 primitive의 외형을 시각적으로 변형을 시킬 가능성이 있기 때문에, velocity 속성을 사용합니다. 

다들 아시겠지만 간단한 예를 들자면, velocity.x=1, velocit.z=-1이면 후디니 world axis를 기준으로 남서쪽을 가리키게 되고  x=0,z=-1이면 남쪽을 가리키게 됩니다. 이러한 규칙을 나열하면 아래와 같습니다.

방향 velocity.x velocity.z
 0  -1
북동  -1 -1 
 -1
남동  -1
 0
남서  1
 1
북서  1 -1 

 보시면 분명한 규칙을 갖고 순환을 하고 있다는 것을 알 수 있습니다.  이해가 쉽게 간단하게 규칙을 표현 하자면 시계방향으로 돌때,

x는 0, -1, 0, 1, 0,-1....

z는 -1, 0, 1, 0, -1,0...

과 같이 clamp된 형태의 -1~1범위의 톱니 형태의 그래프를 그리고 있음을 알 수 있습니다. 그리고 x와 z는 완벽히 같은 형태의 그래프를 갖고 있으나 z가 x축으로 얼마간 더 이동이 되어 있습니다. 이러한 규칙을 가지고 velocity를 부드럽고 자연스럽게 회전을 하게 만들기 위해서 ease in/out 형태의 톱니 구조 그래프인 삼각함수를 이용합니다.  sin(radian)의 형태인데,  point number와 같은 속성을 적절히 fit 시켜서 radian으로 사용하고 특정 값을 곱하거나 더 해서 frequency를 높이거나 줄여 원하는 range(-1~1)의 시작과 끝을 적용했을때 0~360정도의 순환이 되게끔 만듭니다. 그리고 velocity.z 값에는 x축으로 시작점이 차이가 나는  cos을 적용 합니다.

이렇게 만들어진 velocity의 point 속성을(회전 모션) 어떻게 적용하느냐에 따라 속성을 적용받는 primitive를 시계 방향, 반시계 방향 어느 쪽으로도 원하는 각도 만큼 회전 시킬 수 있고, ramp 파라미터를 이용해 회전을 직접 조정하거나, expression을 이용해 끊임 없이 회전하는 애니메이션을 만들 수도 있습니다. 

Forums:

 vopsop에서 rotate라는 노드가 matrix를 이용한 rotation을 지원합니다. 사용법은 포지션에 로테이트매트릭스를 곱하면 됩니다.

로테이션은 원점기준이기 때문에 원하는 지점을 기준하고 싶다고 하시면 로테이션을 하기전에 포지션에서 기준점을 빼준후 로테이션을 적용하고 다시 기준점만큼 더해주면 됩니다.

그리고 angle은 라디안 단위이기 때문에 인풋을 degree로 받아들였다면 degreetoradian이라는 노드를 써서 변환해주면 됩니다.

예제파일을 올리려했으나 어떻게 올리는지 모르겠네요.  

 vop을 사용할때 rotate를 어떻게 사용하는지 몰랐었는데

degreetoradian도 알게되었고 팁 고맙습니다.

아.. 네, ㅎ 

간단한 샘플파일을 후디니스트 까페에 올렸습니다. 참고하시면 도움이 될듯 하네요.