STUDY: TWA후디니 랭글러 2기 Beginner

최초입문 8강 part 2 (2023. 1. 26)

랭글러 오후 2023. 1. 29. 13:58

8강 part 2
Procedural LAMP Modeling

LAMP의 구조



① neck과 base를 기준으로 middle의 각도가 자동으로 계산되어야 한다.
② neck과 target의 관계 설정 및 head의 끝 지점(위치) 구하기
③ base, middle, neck, head 4개의 점으로 구성된 선을 기준으로 면을 만든다. (점➡선➡면)

- 램프 만들기의 1차 목표는, 다른 작업에서 발생할 수 잇는 문제(고민)을 해결할 수 있는 능력을 기르는 것이고 두번째는, 램프의 관절 움직임(꺾이는 각도)를 구하는 것이다.


점 만들기
- 0번과 1번 점으로 활용하여 2번 점을 자동으로 구한다.

2번 점 구하기



- Add 노드 2개를 만든다.
- BASE가 될 0번 점: (0, 0, 0)
- NECK이 될 1번 점: (4, 2, 0)

- BASE와 NECK 사이의 가운데 점을 attribute wrangle 노드를 활용해 2번 점으로 만든다.

- Attribute wrangle 1번 input에 BASE 노드 연결, 2번 input에 NECK 노드 연결(1번 input에 연결되는 정보가 주요 정보이다)
- vector 정보를 받아 줄 vector 변수나 vector attribute가 필요하다.
- 변수를 선언하고 point( ) 로 attribute wrangle과 연결된(1번 input) 점의 위치(position) 불러오기

01
neck의 좌표 확인



- 0번 점과 1번 점 가운데 점이르모
@P = ( @P + @VA ) / 2;

@P: BASE의 점 정보
@VA: NECK의 점 정보

- 0번 점 BASE와 1번점 NECK의 위치가 달라질 때마다 2번 점@P의 위치도 달라진다.



- 만약, 1:1인 한가운데가 아니라 3:2 비율, 5:3의 비율로 중점을 찍고 싶다면 (목표1: vector의 연산을 알아야 한다, 목표2, attribute wrangle 노드에서 [Run Over: Detail (only once)]를 활용해 직접 점을 만들어 준다)

- 12를 기준으로 구하기

= 20



- 24를 기준으로 구하기

= 20



➡ 같은 값이 구해진다(당연)

- y방향으로 커질 때 x를 기준으로
x + [ ( y – x ) + { ( y – x ) / ( a + b ) * a } ]

(y - x)인 거리를 a와 b의 비율로 나눈 것


012
= (ay + bx) / (a+b)


a:b가 2:1일때 값 = 20


그렇다면 좌표값에 공식화해보자


012



⭐3차원이 되어도 같은 공식을 사용할 수 있다⭐


Addpoint( )

Run Over: points와 Run Over: Detail(only once)의 차이


- 비어 있는 정보에서 addpoint (0, vector) 라면
① [Run Over: points]
➡ 점에 대한 정보가 없기 때문에 아무것도 생성되지 않는다.
② [Run Over: Detail(only once)]
➡ 점이 추가 될 뿐이므로 명령을 수행한다.


in HOUDINI
attribute wrangle로 점 만들기
- 두개의 attribute wrangle 노드를 만들고 각각 Run Over 옵션을 Points와 Detail (only once)로 설정

- addpoint(몇 번 input에 대하여, 위치벡터);

addpoint(0, { 0, 2, 0 });
➡ 0번 input에 대하여 (0, 2, 0)의 위치에 점을 생성

- vector base; ⬅변수를 선언하고
- base = set(0, 3, 2); ⬅값을 선언하고
- addpoint(0, base); ⬅ 위치 벡터에 변수

01
K위 위치 값 확인

  

중점까지의 거리를 비율로 만들기
- CONTROL 노드에 파라미터 생성
- 비율이 되는 float 파라미터 2개
- base의 좌표값 vector3
- neck의 좌표값 vector3

- 변수 선언, 값 선언, CONTROL 노드에서 파라미터 복사, 붙여넣기

B: 0ch .. 오타..



- Addpoint( ) 에서 input 정보가 없을 때 0을 입력하면 스스로 점을 만들겠다는 것을 뜻한다.
- base와 neck 점을 만든다.
- 중점인 middle값을 구해준다.



다시 램프 만들기

램프의 각도



1. 피타고라스의 정리로 꺾이는 각도 구하기 = attribute wrangle(VEX)

- 램프의 base와 neck의 점을 연결하는 선과 램프의 다리 a, 다리 b의 중점인 꺾이는 점 middle에 수직인 점은 다리 길이를 반지름으로 하는 구가 겹치는 부분의 원의 중심점이다. 이를 활용하여 구할 수 있는 원의 반지름은 RAD

우리가 알고 싶은 것: RAD



- RAD는 두개의 삼각형에서 공통의 길이이다.

값들의 관계를 이용해 x값을 구할 수 있다

01
x값 구하기



제곱을 나타내는 pow( ) 사용
float x = ( pow(a, 2) – pow(b, 2) + powe(c, 2) ) / 2c

루트를 나타내는 sqrt( ) 사용

RAD 값


float RAD = sqrt( pow(a, 2) – pow(x, 2) )


2. 작도하여 꺾이는 각도 구하기
- 두개의 원이 겹치는 부분을 활용 ➡ Boolean 노드 활용

우리가 알고 싶은 것 RAD



in HOUDINI
attribute wrangle(VEX)로 만들기
1. 점 만들어주기 base, neck (AT WR - detail)
2. X와 RAD 값을 attribute로 받기 (AT WR – points)
float X = (pow(a,2)-pow(b,2)+pow(c,2))/(C*2);
float RAD = sqrt(pow(a,2)-pow(x,2));
3. base에서 X만큼 떨어진 점 생성 (AR WR – detail)
4. N 노말 세팅하기 (AR WR – points)
5. 원의 사이즈를 RAD 값으로 설정하기 & 미들 점에 붙이기
6. 가능한 지점 중에서 가장 높은 점 택하기
7. 점 분리해주고 선으로 만들어주기

- CONTROL 노드를 생성하고 float 속성의 비율 A, B 파라미터와 vector 속성의 위치값 base, neck 파라미터 만들기
- 점 base와 neck을 attribute wrangle로 만들어 주고 파라미터 생성 후 CONTROL 노드와 연결

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

- x와 RAD 값을 구하기 위해 새로운 attribute wrangle을 연결하고 base와 neck을 다시 한 번 변수 선언(변수는 계승이 되지 않기 때문에)을 하면서 동시에 값 선언(위치 값 position)

선언



- 비율 A, B와 base와 neck을 연결하는 직선거리 C(보조 선), X와 RAD를 변수 선언하고 A, B 값 선언 후 CONTROL 노드 연결

파라미터 생성



- distance(vector, vector) 으로 base와 neck 거리 구하기
C = distance(base, neck)

(잘 구해졌는지 확인이 필요하다면 attribute로 만들어 Geometry Spreadsheet에서 값 확인)

- X와 RAD 값 구하기
X = (pow(A,2)-pow(B,2)+pow(C,2))/(C*2);
RAD = sqrt(pow(A,2)-pow(X,2));

- base에서 X만큼 떨어진 점을 구하기 위해 normalize 개념을 알아야한다.

Normalize: 0에서 임의의 점K로 향할 때, K의 방향으로 1만큼의 길이(vector)

- 새로운 attribute wrangle을 연결하고 다시 base, neck 변수 선언, 값 선언

⭐매우 중요⭐
Run Over 가 Detail(only once)일 경우에 모든 점이 아닌 하나의 점, 한 번만 명령을 수행할 것이기 때문에 attribute가 가지고 있을 여러 개의 점 중에 어떤 것을 불러올 지 알 수 없다.

- 따라서, point( )을 이용하여 구체적인 값을 불러와야 한다.

좌표 알려주기



- dir: base에서 neck까지의 거리
- Ndir: nomarlize(vector) 을 활용한다
- temp: base에 X값 만큼 Ndir방향으로 더해준다

012
temp, dir, Ndir



- 변수 temp를 활용해 점을 만든다.

Ndir 방향으로 X값 만큼



- normal의 활용
- 바라보고 있는 방향이 normal
- normal로 인해 좌표로 찍은 값을 바라보게 된다.

012
normal의 방향

    

- neck을 바라보고 있는 normal 만들기

↗ 방향으로



- 모든 점에 동일한 normal을 만들기 위해 Run Over는 points
- base, temp, neck 변수 선언, 값 선언을 선언하고 normal 구하기

01
temp의 위치

  

01
normal의 방향이 바뀌었다



- blast를 이용해 필요한 점만 남기고 지운다.

- 원의 반지름을 우리가 필요한 RAD값으로 치환해주기 위해 circle의 uniform scale에 RAD가 선언된 attribute wrangle의 경로를 작성한다.

point("../set_N",0,"RAD",0)

- circle의 primitive type을 polygon으로 바꾸고 360도 각도를 고려하여 divisions값을 360도로 설정(arc type: open arc)
- carve를 이용하여 base와 neck이 연결될 점의 위치(middle)를 0번 점으로 설정할수 있고 blast로 점을 떼어낸다.

- base, neck, middle 점을 선으로 연결
- 변수가 선언된 마지막 attribute wrangle에서 base와 neck점을 blast로 떼고, 선을 연결하기 위해 merge 노드에서 순서를 정렬하고 add로 선을 만든다.

01
램프의 뼈대 완성

  

- 똑바로 서있는 램프로 만들기 위해 원의 외곽라인에서 가장 높은 지점을 middle로 설정해야 한다.
- 이때, sort 노드 활용

- [Point Sort: By Y]: y방향으로 작은 값부터 0번으로 시작하는 정렬이 된다.
- divisions값이 올라갈 때마다 최고점의 숫자가 바뀌기 때문에 sort를 하나 더 연결하여 [Point Sort: Reverse] 순서가 바뀐다.
- polygon으로 되어있는 원이기 때문에 divisions의 값이 작을수록 정확한 위치값을 구하기 어렵다. 최대한 높은 값으로 설정
- blast로 가장 높은 점 0번을 떼어내고 carve로 구했던 0번 점 대신 middle의 점으로서 merge에 연결한다.

(리깅에서 팔꿈치의 방향을 결정하는 방법과 유사하다..!)

- neck의 y값과 z값에 값을 주어 잘 작동하는지 애니메이션으로 확인해본다.


작도로 만들기
- base와 neck 변수 선언, 값 선언, 점 생성

- base인 0번 점, neck인 1번점을 blast로 분리
- 다리 길이의 비율이 될 sphere 2개를 생성하고 copy to point로 sphere를 base와 neck에 연결
- CONTROL 노드의 A, B 파라미터 copy parameter, sphere의 uniform scale에 paste relative reference

- 겹치는 영역을 구하기 위해 boolean 활용
- polygon일 때만 작동한다. (Frequency 수치를 높여 구에 가깝게 설정)

01
겹쳐진 구



- [Boolean] – [Output Geometry] – [Operation: Intersect, A-B] 겹치는 부분 추출

A - B일 때

01
A - B 시각화

  

- 오늘 활용할 boolean의 옵션: [Output Edge Groups]
- 겹치는 영역의 외곽라인을 구할 수 있다.

그룹명이 된다: abseams



- blast에서 group으로 떼어낼 수 있다.

- polygon인 원이 겹쳐 만들어진 점과 선이기 때문에 우리가 원하는 외곽으로 정리해주어야 한다.
- 이때, polygon mesh로 primitive type을 바꾼 구와 normal활용

v@N;
@N = neck - base;

normal 시각화



- sphere의 rotate x값을 90도로 수정하여 Ndir와 방향을 맞춰준다.

012
중심 축을 기준으로 normal의 방향을 맞춰야 한다



- boolean으로 만들어낸 부분의 가장 높이 있는 점을 활용하여 램프가 똑바로 서 있을 수 있도록 sort 노드 연결

- 정확한 값을 구하기 위해 구의 Columns 숫자를 높여야 하지만 boolean은 굉장히 복잡한 연산을 하는 기능이므로 마지막에 cash를 활용하여 추출해야 한다. (나중에)

적은 polygon은 정확한 값이 될 수 없다


  
- sort한 점 middle과 base, neck 연결

01
작도의 결과


움직이는 램프 뼈대!