중요했던 부분:
- Point
후디니가 제공해주고 있는 3D 공간상에서 다룰 수 있는 가장 작은 단위의 결과물이다.
필수 요소:
@P - 3D상에서 위치를 지정해주는 각각의 X/Y/Z값.
@ptnum - 모든 포인트들은 각기 숫자에 할당하는 각각의 포인트 넘버를 가지고 있다. 보통 포인트 넘버는 무조건 0부터 시작한다.
선을 형성할때는 모든 원하는 포인트들을 연결하여 선을 구성하고 이 모인 선들의 안쪽을 채워주면 면을 형성하는 것을 알 수 있다.
- Vertex & Primitive
이 모든 과정을 제작과정이라 가정했을시에 point는 재료같은 것이고 vertex는 제작 매뉴얼이라고 가정하면 된다.
vertex는 특히 "반드시 이와 같은 순서로 제작하라"라고 명령하는 정보들을 가지고 잇다고 보면 된다.
eg) 0번 결과를 0 -> 5 -> 2로 연결
eg) 1번 결과를 4 -> 1 -> 7로 연결
이러한 결과는 geometry spreadsheet 상에서 이렇게 나타낸다.
- 규칙과 포인트 넘버를 나타낸 spreadsheet
point number | |
0:0 | 0 |
0:1 | 5 |
0:2 | 2 |
1:0 | 4 |
1:1 | 1 |
1:2 | 7 |
여기서 볼수 있는 정보는 왼쪽 column에서 0번 프리미티브와 그 프리미티브를 이루는 포인트들의 순서 그리고 1번 프리미티브와 그 프리미티브를 이루는 포인트들의 순서를 나타낸다. 그리고 오른쪽 column은 각각의 프리미티브를 이루는 포인트들의 @ptnum (point number)로써 나타낸다.
후디니에서 geometry를 구성할때는 무조건 point -> vertex -> primitive 순서로 진행되어야 한다.
- 포인트들의 위치정보가 필수적이다 (만약 x/y/z값들중 하나라도 없다면 그 포인트는 3d 상에서 나타낼수 없으므로 포인트로써 성립하지 못한다)
- vertices의 요구사항은 규칙과 포인트 넘버이다.
- 그리고 위의 설명에 따라 만들어진 정보가 primitive에 저장된다.
이러므로 인해 primitive상에서 point의 위치를 직접 변화를 주는것은 불가능하다.
eg) run over가 primitive로 설정되어있다면
@P.x = @P.x + 1; // 과 같은 이러한 식은 geometry에 변화를 나타내는 것이 불가능하다. primitive wrangle상에서의 @P는 읽기만 가능하지 쓰는건 불가능 하므로.
eg) v@K = @P;
@K = @K + {1, 0, 0}; // 같은 경우는 유저가 직접 만든 attribute에 @P값들을 저장하고 그 값들에 알맞은 벡터값들을 계산시키므로 geometry spreadsheet상에서 나타내는 것이 가능하다. 하지만 scene view에서 geometry 결과로 나타나지는 않는다. 왜냐면 계산된 값들은 오직 유저가 형성시킨 attribute에서만 적용되었으므로.
- Display Options (d) -> Guides -> Guides Sizes -> Guide Font
Scene View에서 나타나는 가이트 즉 point number/primitive number같은 글씨들의 폰트 사이즈를 조정함.
- Primitive Wrangle
Run Over가 primitive로 설정되었을때는 point로 설정된것과 다른 양상의 결과를 낳는것을 관찰 할 수 있다.
eg) v@K = @P; // 포인트의 위치가 geometry spreadsheet의 포인트값들에 있어 뜨지 않는다. 대신 spreadsheet을 프리미티브로 설정을 바꿔주면 뜨지만 @P 디폴트 값이 없이 바로 K[0], K[1], K[2] 이런 식으로 뜨는것을 확인 할 수 있다.
또한 프리미티브 geometry spreadsheet상의 수치들은 면 중심의 위치정보를 가리킨다.
만약 grid상에서 이러한 픽셀값들을 나타낸다면, 위의 참조처럼 원점으로부터 포인트까지의 거리는 면의 꼭짓점까지의 거리로 의미할 것이고 원점으로부터 프리미티브까지의 거리는 면의 중심의 점까지의 거리로 의미할 것이다.
이러한 특징을 삼아 코드를 작성한다면
eg) float d = length (@P); // 원점으로부터 모든 포인트까지의 거리
d *= chf ("SCALE"); // 거리의 스케일 조정. sin()을 대입했을때 SCALE의 수가 높아질수록 더욱 촘촘해짐
@Cd = 0; // @Cd를 0으로 초기화
@Cd.r = sin (d); // sin wave를 적용한 d값을 @Cd.r에 저장하여 특정부분이 빨간색으로 나타나게 함.
- How to know about attributes like ptnum, P, N, numpt etc
Attribute VOP으로 들어가 geometryvopglobal1 노드에 각기 built-in attribute 이름에 마우스 커서를 갖다 대면 이것이 어떤 Type인지 그리고 정확한 풀네임은 무엇인지 알 수 있다.
- Detail (Only Once) & Vertices Wrangle
Detail (Only Once)는 모든 포인트들이 아닌 오직 하나의 포인트값에 구체적으로 VEX를 적용하는 것이다.
이 두 방식의 run over들은 나중에 배울 addpoint()와 밀접한 관련이 있다는 힌트를 받았다.
- Attribute Names
Attribute에 값을 store할때 variable과 attribute의 이름이 같지 않아도 작동된다.
eg) float TWA = 2.27; // float variable TWA에 2.27을 입력함
f@myTWA = TWA; // 위에서 선언된 float variable TWA를 float attribute myTWA에 저장. 그러므로 @myTWA는 variable TWA의 값 (정보)들을 가지게 된다. 선언된 variable와 저장되는 attribute의 이름이 다르므로 geometry spreadsheet에는 attribute의 이름으로써 디스플레이한다.
Exercises:
1. set normals per prims
기존에 grid에 작성하였떤 vex에 sine wave에 normal값들 곱하여 프리미티브의 3D 방향에 따라 결정된 값으로 각기 선언된 @Cd값으로 저장될 수 있게 세팅하였다.
eg)
float d = length (@P); // 원점으로부터 모든 포인트까지의 거리
d *= chf ("SCALE"); // 거리의 스케일 조정. sin()을 대입했을때 SCALE의 수가 높아질수록 더욱 촘촘해짐
d += @Time*chf ("SPEED"); // @Time을 더하여 모션을 입혀줌. chf()으로 @Time의 스피드를 조정할 수 있게 함
@Cd = 0; // @Cd를 0으로 초기화
// 프리미티브의 3D상에서의 방향의 따라 결정된 값과 sine wave가 곱해진 값들이 각각의 색에 적용되어 화려한 모션을 생기게한다.
@Cd.r = @N.x*sin (d); // @N.x에 sin()이 적용된 d값을 곱하여 @Cd.r에다 저장함.
@Cd.g = @N.y*sin (d); // @N.y에 sin()이 적용된 d값을 곱하여 @Cd.g에다 저장함.
@Cd.b = @N.z*sin (d); // @N.z에 sin()이 적용된 d값을 곱하여 @Cd.b에다 저장함.
2. set a @d attribute on prims in one wrangle, and use it to create a sine wave in another
Attribute는 여러개의 wrangle노드 사이에서 공유가 가능하다는 특징을 이용하여 두개의 primitive attribute wrangle노드를 사용하여 특정한 지오메트리 모션을 형성하였다.
// First Primtive Attribute Wrangle
float d = length (@P); // 원점으로부터 모든 포인트까지의 거리
v@d = d; // v@d를 선언하여 위에 선언된 float d값을 저장하였다.
// Second Primtive Attribute Wrangle
// @d는 윗 wrangle에서 선언됬음에도 불구하고 attribute는 variable과 다르게 다른 wrangle노드에서도 재선언 없이 작동이 가능하여 위의 @d를 아래 노드로 가져와서 sin()을 적용하기로 함.
@Cd = 0; // @Cd를 0으로 초기화
@d *= chf ("SCALE"); // 거리의 스케일 조정. sin()을 대입했을때 SCALE의 수가 높아질수록 더욱 촘촘해짐
@d -= @Time*chf ("SPEED"); // @Time을 더하여 모션을 입혀줌. chf()으로 @Time의 스피드를 조정할 수 있게 함
@Cd.b = sin (@d); // sin()이 적용된 @d값이 @Cd.b에 저장되어 grid상에서 sine wave가 파란색으로 나타날수 있게 함.
이해가 안되었던 부분:
- 위에 작성한 이 VEX 코드
eg) v@K = @P;
@K = @K + {1, 0, 0}; // 같은 경우는 유저가 직접 만든 attribute에 @P값들을 저장하고 그 값들에 알맞은 벡터값들을 계산시키므로 geometry spreadsheet상에서 나타내는 것이 가능하다. 하지만 scene view에서 geometry 결과로 나타나지는 않는다.
: primitive wranlge에서 윗 코드를 적었을때 나는 primitive geometry spreadsheet상에서 @K가 나타나나는 것을 볼 수 있었다. @K는 @P의 정보를 계승했고 그 값들은 spreadsheet에 고스란히 적혀있는데도 불구하고 scene view에서 지오메트리의 변화를 볼 수 없었다. 나는 @P의 정보를 계승한 K값에 vector {1, 0, 0}을 더함으로써 오른쪽으로 지오메트리가 한칸씩 이동할 것이라 생각했는데 그런 변화는 없었다. 하지만 spreadsheet에는 모든 @K[0]값들이 1씩 더해진 값으로써 업데이트된것을 확인 할 수 있었고 그것은 내 의문을 생기게 했다. 나는 이 결과를 "왜냐면 계산된 값들은 오직 유저가 형성시킨 attribute 즉 @K에서만 적용되었으므로" 라고 해석을 하였다. 애초에 @P은 primitive wrangle에서 직접 작성하여 지오메트리에 변화를 주지 못할 뿐더러 좀 더 풀어보자면 @K은 유저가 직접 만든 attribute로써 아무리 @P의 정보를 가져왔다고 해도 오로지 수치들만 가져왔을뿐 built-in attribute로써와 달리 지오메트리의 직접적인 변화에 효과를 주지 못하기 때문이라고 해석하였다.
공부하면서 들었던 생각:
벌써 Day 6까지 오니 감회가 새롭다. 올해 초 Day 7 중반까지 들었던 과거에 나하고 비교했을때 이제 거의 따라잡은것 같다. 오늘 배운 부분도 생각보다 어려운것은 없었던것 같다. 최초입문강의를 들었지만 Run Over가 처음엔 아리송 하기도 하고 잊어버린 것도 있었지만 오늘 강의로 인해 완전히 이해한것 같다. 다음 챕터들때 Detail 과 Vertices wrangle을 깊게 배운다는데 무척 기대된다. 하지만 중간고사... 말로 직접 설명을 하고 코드를 완벽하게 이해해야할 것같아 조금 긴장된다. 만약 엄청 어려운 문제들이 나와서 어버버한다면 어케될까...이런 걱정이 약간 들기도 한다. 오로지 연습과 반복학습이 중요할 것 같다. 그리고 Day 7이 많이 어렵다고 하는데 지난번 지난번에 봤던 것까지 합치면 Day 7만 세번째 들을 예정이라 다행히 어마어마하게 두려움으로 다가오진 않는다. 내 기억으로는 Day 7은 기초가 탄탄해야 twa님께서 말씀하시는 것이 머릿속에 쏙쏙들어오는 것 같았다. 아마 내가 지금까지 쓴 복습일기가 중요하게 작용되는 날일 것같다. 그리고 과제가 정말 기대된다. 드디어 파티클 비슷한 애니메이션을 만들생각에 설레기도 한다. 아마 과제 결과물은 내 인스타그램 계정에도 업로드 할 것 같다. 나만의 결과물을 끊임없이 만들어 사람들에게 보여줌으로써 점차 발전해 가는 FX실력을 어서 빨리 증명해내고 싶다.