최초 입문 6강 part 1 (2023.1.16)
Attribute VOP, Attribute Wrangle 기본이해와 비교
VEX
후디니에서 수학을 알아야하는 이유: 램프 만들기
램프 만들기 아이디어, if A와 B가 같을 때
If A와 B가 다를 때, 램프 컨셉 다지기
램프 뼈대 만들기
램프 면 작업하기
FX와 IK에 대하여
과제:
램프 만들기
-좌표 값은 base와 target에만 입력
-target이 멀어질수록 head의 관심이 줄어든다.
-target이 가까우면 일정 거리를 두고 비춘다.
6강 part 0
1.인터페이스상 분류
Scene View + Node + Parameter
Animation Editor
Dynamics & Simulation
VEX Builder
옆으로 쌓이는 노드이며 속성이 다르다.
Attribute Vop & Wrangle을 반드시 알아야한다.
익숙해질 때까지 절대 쉬워지지 않는다.
2.TWA와 쌓아온 Build-up
노드와 파라미터를 이용한 제작
CONTROL 노드로 각종 파라미터들을 한번에 통제하기
= 사용자화
질문1. 다른 사람이 쓰기 편한가?
질문2. 재사용이 (예외없이)가능한가?
(사용자화) 시스템을 만드는 것 ↔ VEX를 통해 정보를 다루는 것
3.VEX 언어가 뭘까?
필요한 부분(기능)만을 가지고 직접 메커니즘을 만드는 것
4.VEX가 뭐고 어떻게 작용해 왔는가?
VEX언어를 이용한 코딩
5.VEX를 이용해 뭘 하려는 걸까?
사용자가 이용하기에 따라 기존 노드(SOP)에서 구하지 못하는 정보를 다뤄낼 수 있다 ➡ 일종의 개발자 모드
⭐VEX에 대한 이해가 필요하다⭐
노드보다 작은 단위의 단일 명령인 function 함수를 이용한다.
VEX의 최종목표: 후디니가 노드로 준비해주지 않은 연산 작용과 과정을 사용자 스스로 만들고, 이용하기.
6.Attribute VOP vs Attribute Wrangle 특징과 차이점
역할과 수행 능력에서 같다.
Attribute VOP | Attribute Wrangle |
Code & Function ➡ 노드화 & 시각화(function에 필요한 내용이 parameter로 존재함) | 코딩 방식 그 자체로 VEX의 문법을 알아야 함 |
7. Attribute VOP vs Attribute Wrangle 뭐가 더 편한가?
코드를 다 알고 있다면, 노드를 연결하는 것이 번거로울 수 있다.
8. Node(SOP) vs Attribute VOP, Attribute Wrangle; VEX
역할이 다르다. 무엇이 우월하다고 할 수 없다.
⭐작업면에서는 효율이 좋은게 더 중요하고, 후디니를 공부하는 면에서는 Node 작업 외에 VEX는 필수⭐
6강 part 1
Attribute VOP & Attribute Wrangle (VEX)
1. VEX 언어기본지식; All about
2. Attribute Wrangle (VEX): Step by step
3. Attribute VOP: Step by step
4. VOP & Wrangle 비교
동시에 고려되어야할 내용이다.
①VEX 정보의 형태
②내장 기능& 사용자 정의 기능
③DATA-TYPE
④Dot Operators
⑤연산작용
⑥연산자 Operators
⑦ TYPE CASTING
⑧Variables & Attributes
⑨Global Variables 그리고 이미 할당이 되어있는 몇몇 Attributes
①VEX 정보의 형태
②내장 기능& 사용자 정의 기능
③DATA-TYPE
④Dot Operators
⑤연산작용
⑥연산자 Operators
⑦ TYPE CASTING
⑧Variables & Attributes
⑨Global Variables 그리고 이미 할당이 되어있는 몇몇 Attributes
- 또는 기능을 직접 정의한다.
int test ( int a, b ; string c ) {
if ( a > b ) {
print f(c);
}
}
①VEX 정보의 형태
②내장 기능& 사용자 정의 기능
③DATA-TYPE
④Dot Operators
⑤연산작용
⑥연산자 Operators
⑦ TYPE CASTING
⑧Variables & Attributes
⑨Global Variables 그리고 이미 할당이 되어있는 몇몇 Attributes
int: integer;정수
float: 실수
vector vector2 vector4
: 크기와 방향을 갖는 물리량
- 기하학적 방식: 시점에서 종점까지의 크기
- 대수적 방식: 원점을 기준으로 종점까지의 위치 차이로 설명
array: 배열
- 단일 식별자를 통해 Data type의 여러 변수에 접근할 수 있게 하는 집계 데이터 유형 (같은 데이터 타입의 변수를 일렬로 늘어놓은 집계 데이터 유형)
- 반복문 for( )와 결합하여 연속적이고 반복적인 정보 처리
{1, 2, 3, 4, 5, 6, 7}
{vector2, vector2}
{vector, vector, vector}
{vector4, vector4, vector4, vector4}
matrix matrix2 matrix3
: 행렬
- 행row 열column
- Array, Matrix, Vector의 관계를 이해해야 한다.
string: 텍스트 속성으로 정보처리가 가능하다
- "Dog", "Cat", "TWA101", "Hello World"
- 숫자도 입력값이 아닌 텍스트 속성
bsdf, struct: 추후 다룰 속성
①VEX 정보의 형태
②내장 기능& 사용자 정의 기능
③DATA-TYPE
④Dot Operators
⑤연산작용
⑥연산자 Operators
⑦ TYPE CASTING
⑧Variables & Attributes
⑨Global Variables 그리고 이미 할당이 되어있는 몇몇 Attributes
- 정보 택하기
- integer와 float은 정보 그 자체로서 선택해야 할 정보가 없다.
①VEX 정보의 형태
②내장 기능& 사용자 정의 기능
③DATA-TYPE
④Dot Operators
⑤연산작용
⑥연산자 Operators
⑦ TYPE CASTING
⑧Variables & Attributes
⑨Global Variables 그리고 이미 할당이 되어있는 몇몇 Attributes
- 계산을 위한 안전한 아이디어: 같은 데이터 값끼리 연산하는 것으로 시작해보자.
int * int
float * float
vector * vector
- 서로 속성의 정보끼리 계산을 해야 하는 경우 연산 순서에 따라 결과 값이 달라진다.
int * float = int
float * int = float
vector * float = vector
float * vector = float
vector * vector4 = vector
대원칙: 먼저 작성된 속성을 따라가는 결과 값
속성이 정의되지 않았을 때의 예외4
- 특별한 설정을 하지 않은 경우 frame 값을 integer 속성이다.
- 0 프레임, 3프레임, 7프레임에 있는 키프레임에 x1.6과 x1.7을 했을 때의 결과 값이 다르다.
속성이 정의되지 않았을 때의 예외5
- 0 프레임, 3프레임, 7프레임에 있는 키프레임에 x0.5(2배 빠르게)한다음 x2(2배 느리게)을 했을 때, 연산으로 보자면 원래 값으로 돌아갈 것 같지만 integer의 속성 때문에 원래 값과 달라진다.
- 서로 다른 속성의 정보들을 계산할때 마다 조금씩 다른는 규칙들을 알아가야 한다.
①VEX 정보의 형태
②내장 기능& 사용자 정의 기능
③DATA-TYPE
④Dot Operators
⑤연산작용
⑥연산자 Operators
⑦ TYPE CASTING
⑧Variables & Attributes
⑨Global Variables 그리고 이미 할당이 되어있는 몇몇 Attributes
➡ 괄호 안의 조건을 판별하고 그 안의 내용대로 결과 값을 도출하는 연산에 도달할 수 있다.
➡ function( )의 기능을 직접 정의하고 후디니가 제공하지 않는 함수를 만들어서 사용할 수 있다.
①VEX 정보의 형태
②내장 기능& 사용자 정의 기능
③DATA-TYPE
④Dot Operators
⑤연산작용
⑥연산자 Operators
⑦ TYPE CASTING
⑧Variables & Attributes
⑨Global Variables 그리고 이미 할당이 되어있는 몇몇 Attributes
- 타입 캐스팅을 번역하면 형 변환
- 컴퓨터 언어로 규칙에 따라 순서대로 입력해야 한다.
- 정보의 타입 정의할 때, 후디니 문법으로 정의된 function들은 type casting이 필요하지 않다.
①VEX 정보의 형태
②내장 기능& 사용자 정의 기능
③DATA-TYPE
④Dot Operators
⑤연산작용
⑥연산자 Operators
⑦ TYPE CASTING
⑧Variables & Attributes
⑨Global Variables 그리고 이미 할당이 되어있는 몇몇 Attributes
변수와 attribute 작성 방법
- 변수를 선언하고, 변수의 값과 관계 선언, 위치 속성 @P에 입력
- 변수는 노드 내에서만 임시로 사용되는 정보
- attribute는 계산 과정과 결과에 남아 다음 노드에서 제공되는 정보
①VEX 정보의 형태
②내장 기능& 사용자 정의 기능
③DATA-TYPE
④Dot Operators
⑤연산작용
⑥연산자 Operators
⑦ TYPE CASTING
⑧Variables & Attributes
⑨Global Variables 그리고 이미 할당이 되어있는 몇몇 Attributes
- 파라미터와 VEX에서 불러오는 방식이 다르다.
$F ➡ @Frame
$T ➡ @ Time
- 표기와 용도가 정해져 있는 attribute
@P
@Cd
@N
@V
@ptnum
@numpt
in Houdini
인터페이스 정리
Geometry Spreadsheet를 확인하기 위한 인터페이스로 수정
[Geometry] – [Attribute Wrangle]
[Geometry] – [Attribute VOP]
Attribute Wrangle
코드를 직접 입력할 수 있는 VEXpression 파라미터
어떤 속성에다 기능을 수행할 것인지 결정하는 파라미터 [Run Over]
Detail (only once): 특정 정보에 대해 한 번만 정보 처리 과정을 거쳐주세요.
Point: input에서 받은 모든 점(point)에 대해 사용자가 말한 정보 처리 과정을 거쳐주세요.
Primitives: input에서 받은 모든 면(primitives)에 대해 사용자가 말한 정보 처리 과정을 거쳐주세요.
Vertices: input에서 받은 모든 Vertices에 대해 사용자가 말한 정보 처리 과정을 거쳐주세요.
Numbers: input에서 받은 모든 Numbers에 대해 사용자가 말한 정보 처리 과정을 거쳐주세요.
VEX 문법(언어): 사용자가 후디니와 대화하는 방법
반드시 입력해야 하는 코드: 문장 종결 세미콜론(;)
1. 선언
- 존재 선언: 타입 캐스팅과 함께 어떠한 변수나 속성을 사용할 예정이라고 선언, 또는 존재한다고 선언 ➡ 이후 타입 캐스팅을 계속하지 않더라도 존재 인지
- 값 선언: 존재 선언과 병행되어 선언된 존재의 값을 알려준다. 그 값은 타입 캐스팅에서 정의된 값이어야 한다. ➡ 값 입력 or 연결
2. 계산 요청과 명령
- 단순 계산 or 단순 명령 ➡ 계산 or 함수 기능 수행
- 후디니가 스스로 판단하고 계산을 수행하는 조건문, 반복문 등 ➡ 계산 or 수행
Attribute: float
Run Over: Points인 문장일 때,
f@AA; (존재의 선언: float attribute AA가 존재한다.)
@AA = 2.7; (값 선언: float attribute AA의 값은 2.7이다)
f@BB; (존재의 선언: float attribute BB가 존재한다.)
@BB = 3.9; (값 선언: float attribute BB의 값은 3.9이다)
@P.y = @BB; (이미 P라는 attribute를 알고 있으므로 존재 선언을 하지 않아도 되고 불러내기만 하면 된다. 그리고 값을 선언.)
- 아무런 input이 없으므로 input이 될 정보를 연결한다.
- Add로 point를 생성하고 switch 노드로 box와 연결한다.
원래 Box가 가지고 있던 position y값의 방향성을 무시한 채 모든 point가 값을 선언한 position y값으로 치환되었다.
변수: float
float CC; (float 변수 CC가 존재한다.)
CC = 2.7; (float 변수 CC의 값은 2.7이다.)
float DD; (float 변수 DD가 존재한다.)
DD = 3.9; (float 변수 DD의 값은 3.9이다.)
@P.y = DD; (position y값은 DD이다.)
Attribute & 변수: float
float KK; (변수 KK 존재 선언)
f@LL; (attribute LL 존재 선언)
KK = 7.2; (값 선언)
@LL = 2.9; (값 선언)
@P.x = @LL + KK; (값 선언 + 단순 계산)
Attribute & 변수: float의 존재 선언과 값 선언을 동시에
f@TWA = 0.7; (존재 선언과 동시에 값 선언)
float TWB = 0.4; (존재 선언과 동시에 값 선언)
f@TWC = (@TWA*2) + (TWB*0.7); (존재 선언과 동시에 단순 계산)
Attribute & 변수: vector와 function의 단순 기능
vector home; (존재 선언)
vector away; (존재 선언)
home = {0, 2, 0}; (값 선언)
away = set(3, 1, 2); (값 선언 + 단순 기능 수행)
{ }로 vector 값을 만들기보다 set( ) functions으로 vector 값 만드는 것을 권장
v@Dir; (존재 선언)
@Dir = away – home; (값 선언 + 단순 계산)
Attribute & 변수: vector와 function의 단순 기능
존재 선언 + 값 선언 + 단순 기능 수행
v@home = set(0.5, 0.9, -0.3);
v@away = set(-4, -2, 6.2);
v@Dir = (@away - @home) * 0.5;
f@power = length(@Dir);
length( )는 vector 값을 받아서 float 값을 반환한다.
즉, 두 vector @home, @away로 만든 @Dir의 길이(length)를 @power에 나타낸다.
값 선언 과정에서 attribute가 다시 사용된다 (왼쪽 값을 오른쪽 값으로 업데이트)
값 선언 + 단순 계산
@P.x = @P.x + 1;
Transform 노드의 Translate 값과 동일한 속성
@P.x = @P.x + @Frame;
시간이 변함에 따라 바뀌는 @Frame으로 인해 x축방향으로 이동하는 것처럼 보일 것
키프레임 없이 애니메이션이 가능
존재 선언 + 값 선언 + 단순 계산
v@Dir = set(@Frame, (@Frame / 2), 0);
@P = @P + @Dir;
이동거리 = 시간 x 속도 (시간당 이동 방향)
vector VEL = set(1, 0.5, 0.3); (변수 선언, 값 선언, 단순 기능)
VEL값이 너무 클 수도 있기 때문에 나눠주기
float Divide = 20; (변수 선언, 값 선언)
float TT = @Frame; (변수 선언, 값 선언, 단순계산)
@P = @P + (VEL / Divide) * TT; (값 선언, 단순 계산)
만약, 속도를 제어할 수 있는 Divide값에 수치가 아닌 채널값을 넣어준다면 파라미터가 생성된다.