2010-4-18 오픈클래스 | VOPs 경험하기

안녕하세요. 글이 조금 늦어졌군요..

 4/18일 진행된 VOP에 대한 첫 오픈클래스 내용입니다.

이번주는 제가 당일 진행했던 내용을 토대로 대략의 내용을 정리해서 올리도록 하겠습니다.

우선 첫날은 VOP SOP노드를 이용해서 간단한 디포메이션 OP를 만들어보는 것으로 VOP의 기본적인 흐름을 경험해보는데 의미를 두는 시간었습니다.

원래는 예제파일도 같이 올리기로 했었는데 이번엔 올리지 않기로 했습니다. VOP을 처음 접하시는 분들이 많으신만큼 직접 이리저리 만져보면서 VOP에 대해서 경험을 해볼 수 있으면 좋겠습니다.^^  나름대로 이런저런 작업을 해보시고 결과물을 홈피에 올려보는것이 이번주의 과제입니다. ㅎ

그리고 혹시 저번주에 참여하지 못하신 분들중 참여의사가 있으신 분들은 글을 꼭 확인하시고 이번주부터 참여하시면 되겠습니다.

 

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

우선 geo 컨테이너를 만들고 안으로 들어와서 Box를 하나 만듭니다(NURBS, Size : 6*6, Axis Divisions : 50 * 50) 그리고 Box 노드 아래에 VOP SOP노드를 달고 안으로 들어가 봅시다....

  그러면 아래와같이 뭔가 알쏭 달쏭한 두 개의 노드를 만나게 됩니다.

이게 대체 뭘까요?  여기서 global1이라고 쓰여진 놈은 방금 만든 VOP SOP의 인풋에 연결된 노드(box1)가 가지고있는 글로벌 변수 들입니다. 포지션값 부터 시작해서 포인트넘버, 컬러값, 프레임넘버 등등등... 각각의 삼각형 모양에 마우스를 올려두면 무엇을 의미하는지 나오니 한번씩 확인해 보시길..   그리고 오른쪽에 output1은 VOP에서 이런저런 작업을 거쳐서 나온값을 어떤값으로 내보낼지 결정하는 곳입니다.  

 VOP 네트웍의 흐름은 기본적으로 global에서 변수들을 받아와서 구성된 네트웍에 따라서 연산을 하고 그 결과를 output으로 내보내는 것이라는 것을 알아두시기 바랍니다.

(parameter 노드를 통해서 받고 내보내는 경우도 있는데 이것은 이 후에 설명하겠습니다.)

 

말로하는것보다 한번 간단하게 시험해볼까요?

아직 잘 모르더라도 일단 아래와같이 한번 연결해 봅시다.  참고로 turbnoise1의 풀네임은 turbulent noise입니다.^^;

box에 아래와같은 변화가 생겼나요??

turb Noise는 노드의 pos값에 연결된 값에따라서 노이즈 패턴을 만들어주는 일을 합니다.

(참고로 디폴트로 되어있는 alligator noise같은 경우 발생되는 노이즈의 폭은 -1에서 1사이의 범위입니다.)

global1에서 P(position)값을 받아서 노이즈 패턴을 만들고 결과값을 output의 Cd(Color)값으로 보내는 간단한 흐름입니다.

자 이제 Cd에 연결되어있는 와이어를 P로 옮겨보면 어떤 일이 생길지 잠시 고민해 볼까요? 음 P는 position, 즉 위치값이니까 이번에는 모양이 변하겠죠?  음.... 하지만 막상 연결해보면......??? ㅡㅡ;    우리의 box1은 도대체 어디로 가버린걸까요..? 

뷰포트와 네트웍 뷰 사이에 있는 아이콘들중 display points를 눌러보시면 포인트들이 한줄로, 그것도 대각선으로 늘어져있는 것을 볼 수 있습니다.  (이건 벡터에 대한 이해가 필요한 부분인데 일단은 대각선이라는걸 기억하시며 패스~),  아무튼  원래 박스의 크기는 6*6이었는데 모든 포인트들이 -1에서1사이의 위치로 줄을 서 버렸습니다.  

 

하지만 우리가 기대하는 모양은 기존의 형태에서 노이즈패턴에 의한 변화가 일어나는 것인데 어떻게 하면좋을까요?  아래와같이 네트웍에 add를 추가해보면?? (지금은 반드시 add에 들어가는 와이어의 순서가 그림처럼 되어야 합니다.  이유는 나중에 밝혀 집니다 ㅎㅎ 궁금하시면 한 번 바꿔달아보시고 우선 어떻게 되는지만 기억만 해두시기 바랍니다.)

 자.. 원래 박스의 포인트들이 가지고있는 위치값에 노이즈 패턴이 더해져서 원하는바에 조금 더 근접한 결과물이 나왔습니다.  그런데 이번에도 마치 소가 핥은것 처럼 디폼이 대각선으로 적용이 되고 있습니다ㅡㅡ;  왜 이렇게 되었을까요..??

이유는 원래 P는 vector값인데 turb Noise가 내보내는 값이 float이기 때문입니다.

여기서 벡터에 대한 이해가 필요한데, 혹시 잘 모르시는 분들을 위해서 잠시 정리를 해보자면

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

int --> (1),(2), (3), (4) ......   정수

float --> (1.453), (3.456) ....  소수점 아래자리까지 표현 가능한 값

vector --> (1.443, 2.345, 4.535),  (2,3,4)  ...  float 세 개가 모여있는 값

vector에 대한 가장 대표적인 예는 3D에서 위치나 방향을 (x,y,z)로 표현하는것을 생각하시면 되겠습니다.(position, velocity, normal 등)

* vector와 다른것들과의 가장 큰 차이는 int나 float은 한번에 하나의 수만 가지고 있지만 vector는 3개의 값을 한묶음으로 가지고 있다는 점입니다.

 

그럼 vector는 다른 것들과 가지고있는 수의 갯수가 다른데 서로 어떤식으로 연산이 진행될까요?

1. vector 끼리의 연산

 (1,2,3)   +  (2,3,4)  =   (3,5,7)   < -- 서로 대응되는 요소끼리 더해짐.

2. vector와 float간의 연산

(1,2,3)   +   (1)       =   (2,3,4)   < -- float값이 vector의 각 요소에 각 각 더해짐

이런 식입니다. 

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

global1에서 받아온 P과 turb Noise에서 받아온 noise의 값을 더한 상황인데, P는 포지션값이므로 vector입니다. 그런데 noise는P값을 받았지만 결과를 float형태로 리턴을 하고있구요.  이 둘은 가지고있는 숫자의 갯수가 다른데 어떻게 더해질까요?

만약 위의 경우에서 P값이 (1,2,3)이고  noise값이 (1)이라고 칩시다.  그러면 결과는 (2,3,4)가 됩니다. float값을 vector의 세 수에 일률적으로 한번씩 더하고 결과는 vector형식으로 나오게 됩니다. 

그런데 add에 연결된 순서를 바꾸면 아까처럼 포인트들이 대각선으로 늘어서게 됩니다. 이건 왜일까요? Add나 Multiply나 리턴되는 값은 무조건 첫번째 연결된 형태를 따르게 됩니다.  만약 첫번째 인풋이 float값이라면 그 이후에 어떤 형태의 수가 오든 무조건 float으로 리턴이 되게 됩니다.  이런경우에는 float값에 vector의 x(첫번째)값만 한번 더해지고 맙니다. 

그리고 이렇게 나온 float값을 vector값으로 보내게 되면 (현재 상황에서는 output1의 'P') float값을 vector의 각 요소들에 하나씩 똑같이 넣게 되는겁니다.  처음에 포인트들이 대각선으로 정렬된것도, 두번째 디폼이 소가 핥은거처럼 대각선으로 적용된것도 모두 이런 원리 때문입니다. x축으로 1, y축으로 1, z축으로1 이런식이 되니까요..  

저의 설명이 허접해서 오히려 미궁으로 빠뜨리는건 아닌지 모르겠네요.. 하지만 아주 중요한 부분입니다.

 

자 그렇다면 저 한쪽으로 쏠린 노이즈를 모든 방향으로 균일하게 적용시키려면 어떻게 해야할까요?

바로 noise를 float이 아닌 vector형식으로 만들어서 더하면 되겠죠.. 사실 방법은 간단 합니다.

바로 turb noise의 signature를 3D로 바꿔 주면 됩니다. 그럼 이제부터 x,y,z좌표별로 모두 다른 값을 갖는 vector형식의 값을 리턴하게 되고 더이상 한쪽으로 쏠리지 않는 중구난방의 노이즈를 갖게 됩니다.

모두 위와같은 결과물을 보셨나요?  사실 이렇게 add를 사용 하지않고 displacement along normals노드를 사용하면 float값을 가지고도 지금과 비슷한 결과물을 볼 수 있습니다만, 대부분 VOP을 처음 접하시는 분들이 많으셔서 뭔가 개념적으로 접근해보고자(?) 장황한 설명을 늘어 놓게 되었네요.. 

저의 설명이 허접해서 오히려 미궁으로 더 빠져들게 하는건 아닌가에대한 고민을 시작하며..    오늘글은 마치겟습니다.

  turb noise말고도 Vop 네트웍안에서 탭키를 쳐서 pattern에 들어가보면 다양한 종류의 노이즈들이 있습니다.  이거저거 내키는대로 꺼내서 한번 만져보시고 수치들도 조정해보면서 뭐든 한 번 해보시기 바랍니다. 그리고 간단한 것이라도 결과물을 홈피에 올려주세요.

처음에 말씀 드렸듯이 이것이 이번 오픈클래스 숙제입니다.ㅎㅎ

 

참고로 각각의 노이즈패턴이 어떤식으로 나타나는지 확인해보고싶으면 값을 컬러(Cd)에 연결해보는것이 최고랍니다.  그리고 Flow Noise나 antialias Flow Noise는 Flow를 Global Variables의 Time에 연결해보면 재미난 효과를 불 수 있으니 한번씩 해보세요 ㅎ