Programming/Houdini - TWA

[Houdini] Open The Houdini 8-2

와들S 2023. 7. 18. 13:16

1. Outputs

mp4를 gif로 만들어서 화질구려요

 

2. Reviews

1) 사용한 식 - 선분 위 비율 값

강의속 자료

- x, y 두 점에서 a:b란 비율을 가진 중간의 점은 위의 식을 가지고 계산할 수 있다. 

강의속 자료

- 위의 식을 이용하여 벡터로 된 값들에 대한 식을 도출하였다. 

 

2) Points VS Detail (Only once)

강의속 자료

- wrangle을 쓸 때, 그냥 points와 detail (only once) 란 선택지가 있다. 그냥 points는 모든 점에 대해 계산하는 것이므로 모든 점에 대해 새로운 점들이 생겨 총 10개의 점이 생성된다. 반면 Detail only once 같은 경우에는 딱 점 하나만 추가된다. 

- 그 어떠한 점도 없는 wrangle 노드라고 생각해보자. points의 경우 addpoint(0, V) 란 함수를 써도 그어떠한 점도 받지 않았으므로 그 어떠한 점도 생성하지 않지만, detail의 경우 점 생성에 대한 명령 그 자체를 실행하므로, 아무런 점을 받지 않더라도 점 하나를 생성한다. 즉 우리가 add노드로 점을 만든 것처럼 wrangle 그 자체에서도 detail only once 를 이용해 점을 생성할 수 있다.

 

3) 실제 해본 실습 예제들

- 직접 푼 두 점 사이의 중간값 가진 점

- 직접 푼 비율 문제. base와 neck을 어떻게 불러와야할지 몰라서 개노가다 했는데 선생님은 쉽게 하셨다. 다음엔 저렇게 해야지. ch뒤에 쓸 자료형을 잘 맞춰야겠다.

강의 속 코드 캡쳐본

- 실제로 하실 땐 나처럼 굳이 float 변수들을 만들어 값을 보관하지 않고 바로 하셨다. 
vector middle = ((base * B) + (neck * A)) / (A+B); 이렇게

- 나도 다음엔 더 깔끔히 쓸 방법이 있나, 더 효율적인 코딩이 있나 고민해보고 완성해야겠다. 

 

4) 2가지 방법

강의자료캡쳐
강의 자료 캡쳐

- 피타고라스 정리로 구했을 때 위 식이 나온다.

강의자료캡쳐
강의자료캡쳐

 

즉, 이를 정리하면,
 1. 피타고라스의 정리로 구할 경우 -> Attribute Wrangle (VEX)
 2. 작도로 구할 경우 -> Node Base Style 

 

5) 제작 방법 with VEX

(1) Attribute Wrangle: Generate Points

vector base = chv("base");
vector neck = chv("neck");

addpoint(0, base);
addpoint(0, neck);

- 첫 Attribute Wrangle에 두 가지 값을 Control(null) 에서 받아와 점을 만든다. 설정은 당연히 Detail(only once)이다.

(2) Attribute Wrangle: get X & RAD

vector base, neck;

base = point(0, "P", 0);
neck = point(0, "P", 1);

float A, B, C;
float X, RAD;

A = ch("A");
B = ch("B");
C = distance(base, neck);   // distance

X = (pow(A, 2) - pow(B, 2) + pow(C, 2)) / (C*2);
RAD = sqrt(pow(A, 2) - pow(X, 2));

f@X = X;
f@RAD = RAD;

- 여기서 주의할 점은 이 노드는 Detail이 아니고 Points 라는 점이다. 왜 이렇게 안되나 대체 왜 속성이 안만들어지나 고민했었는데 문제는 바로 Points로 해두지 않았기 때문이었다. 위 노드에서 만들어진 점을 받아 속성만 더하는 거니 Points로 써야 하고, 점을 만드는게 아니니  Points로 만들어도 괜찮다. 

(3) Attribute Wrangle: generate Temp

vector base = point(0, "P", 0);
vector neck = point(0, "P", 1);

float RAD = point(0, "RAD", 0);
float X = point(0, "X", 0);

vector temp, dir, Ndir;

dir = neck - base;
Ndir = normalize(dir);

temp = base + Ndir*X;

addpoint(0, temp);

- 'temp = base + Ndir*X' 란 코드를 주의깊게 봐야한다. temp (temporary)로 만들어진 점을 만드는 식이다. dir를 노말화한 백터에 위 노드에서 계산한 X 값을 곱하고, 그걸 base 벡터에 더해 중간 점을 만든다. 

(4) Attribute Wrangle: get N

- 이 노드는 points로 작업해야 한다. 왜냐하면 모든 점에 대해 노말을 만들기 때문이다. 노말을 neck - base로 벡터를 형성하고, 이를 copy to point를 이용해 붙인다. 여기서 가운데 2번점의 원만 필요하므로 blast로 필요한 것만 떼어내 보이게 한다.

(5) Sort: The highest point for 'middle'

- 먼저 저 원의 반지름에 point함수를 이용해 RAD 값을 넣는다. 

- 원 위의 점들 중 가장 y값이 높은 (높이 있는) 점을 가지고 연결해야 한다. 왜냐하면 가장 높이 있는 점이 가장 똑바로 서 있는 점이기 때문이다. 그 점을 구하기 위해선 원 자체의 Division을 크게 올리고 sort란 노드를 사용한다. sort는 점을 특정 분류에 의해 순서를 재배치해주는 노드이다. 첫 번째 sort1엔 y값으로 분류 위해 by y를 쓰고, 그 아래 sort에서 reverse란 기준을 사용한다. 여기서 가장 높이 있는 점이 0으로 놓아져있으므로 그 0점을 blast로 따로 떼어 준다.

- 마지막으로 세 점을 merge로 묶어주면 된다!

 

6) 제작 방법 with Nodes

- 노드 쓴다는 것 외엔 과정은 비슷하다. 하지만 VEX보단 훨씬 연산이 많아 (Boolean 때문인듯) 느리고, 점도 정확히 원에 있는 것도 아니라서 조금 끊기는 느낌은 있다. 역시 VEX가 좋은 듯

- 이 노드에선 Boolean을 썼고, 그 와중에 이제 두 원의 노말을 맞추기 위해 새 attribute wrangle을 사용하였다. 

 

🥕🥕🥕🥕🥕

- 재밌었다. 일단 스터디 그룹은 8-2까지 보는 거긴 한데 시간이 나면 뒤에것도 보면서 마무리해야겠다. 

'Programming > Houdini - TWA' 카테고리의 다른 글

[Houdini] Joy of VEX (Day 3)  (0) 2023.07.20
[Houdini] Joy of VEX (Day 2)  (0) 2023.07.20
[Houdini] Open The Houdini 7-1, 8-1  (0) 2023.07.17
[Houdini] Open The Houdini 6-3  (0) 2023.07.17
[Houdini] Open The Houdini 6-2  (0) 2023.07.14