최초입문 6강 part 3 (2023. 1. 18)
Attribute VOP, Attribute Wrangle 기본이해와 비교
VEX
후디니에서 수학을 알아야하는 이유: 램프 만들기
램프 만들기 아이디어, if A와 B가 같을 때
If A와 B가 다를 때, 램프 컨셉 다지기
램프 뼈대 만들기
램프 면 작업하기
FX와 IK에 대하여
과제:
램프 만들기
-좌표 값은 base와 target에만 입력
-target이 멀어질수록 head의 관심이 줄어든다.
-target이 가까우면 일정 거리를 두고 비춘다.
6강 part 3
시계 애니메이션을 Attribute VOP과 Attribute Wrangle(Basic VEX)로 만들어보기
1. 변수 체크 최소이론 확인
2. 작업 세팅
3. Attribute Wrangle VEX code Style
4. Attribute VOP TEX node Style
- (시작하는) 시간 입력
- frame, 초침, 분침, 시침 관계
- frame에 따른 시간 정의: FPS
- 관계에 따른 frame 당 움직일 각도
- 시작 각도, 움직인 각도, 결과 각도
- 변수 이름 정하기
시간입력
- 초침, 분침, 시침 시작 시간 ➡ IS, IM, IH
frame, 초침, 분침, 시침의 관계
- 시침이 한바퀴 돌 때 몇 시간인지? ➡ DH
- 1시간에 몇 분인지? ➡ HM
- 1분에 몇 초인지? ➡ MS
- 1초에 몇 프레임인지? ➡ SF
frame에 따른 시간 정의
- 우리가 정의한 1초는 몇 프레임인지? ➡ FPS
- 현재 frame은 몇 초인지? ➡ TIME
- 현재 frame에 초침이 몇 번 움직였는지? ➡ COUNT
- (float 초 – int 초) ➡ DECI
관계에 따른 frame 당 움직일 각도
- 1frame 당 초침이 움직일 각도 ➡ S
- 1frame 당 분침이 움직일 각도 ➡ M
- 1frame 당 시침이 움직일 각도 ➡ H
시작 각도
- 시작 초침 각도 ➡ SS
- 시작 분침 각도 ➡ SM
- 시작 시침 각도 ➡ SH
움직인 각도
- 움직인 초침 각도 ➡ AS
- 움직인 분침 각도 ➡ AM
- 움직인 시침 각도 ➡ AH
결과 각도
- 최종 초침 각도 ➡ FS
- 최종 분침 각도 ➡ FM
- 최종 시침 각도 ➡ FH
예시: 2시 45분 30초 라면,
IH = 1, IM = 45, IS = 30
DH = 12, HM = 60, MS = 60, SF = 24
FPS = 24, TIME = @Frame / FPS, COUNT = floor(TIME), DECI = TIME – COUNT
S = (360 / MS) / SF, M = S / HM, H = M / DH ➡ 분침은 초침보다 얼마나 느릴까? 시침은 분침보다 얼마나 느릴까?
- 예를 들어 1시 30분 45초라고 했을 때, 초시간과 분시간의 영향으로 시침의 위치가 결정된다. 또한 분침은 초시간에 영향을 받는다.
SH = (IH + (IM / HM) + ((IS / MS) / HM)) * (360 / DH))
SM = (IM + (IS / MS)) * (360 / HM)
SS = IS * (360/MS)
- frame이 얼마나 지났는지 * 프레임 당 각도
AS = (COUNT * FPS) * S
AM = (TIME * FPS) * M
AH = (TIME *FPS) * H
FS = SS + AS
FM = SM + AM
HM = SH + AH
시계 애니메이션
- Attribute VOP과 Attribute Wrangle로 표현하더라도 같은 논리가 적용된다는 것을 이해해야 한다.
- 00:00:00 에서 시작하는 시계 애니메이션.
- Attribute로 값을 나타내기 위해서는 점이 있어야한다.
- Add로 점을 만들고 Attribute Wrangle연결
- Null도 연결한 후 info로 네이밍
- 초침, 분침, 시침에 기존의 Transform 노드를 삭제하고 새로운 Transform 노드 연결
- 새롭게 연결한 [Transform] – [Rotate: z값]을 Attribute Wrangle에서 만들어 준다.
- 그렇게 만든 값을 null(info)가 받고 info가 받은 FS, FM, FH 정보를 초침, 분침, 시침의 [Transform] – [Rotate: z값]에 넣어준다.
- 정보가 많을 때 필요한 정보만 Attribute로 뽑아낸다.
- 연습할 때는 Geometry Spreadsheet에서 확인할 수 있도록 모든 정보를 Attribute으로 만들기
f@IH = 2;
f@IM = 45;
f@IS = 30;
//input time// : 메모처럼 작성할 수 있다
f@DH = 12;
f@HM = 60;
f@MS = 60;
f@SF = 24;
f@FPS = 24;
f@TIME = @Frmae/@FPS;
f@COUNT = floor(@TIME);
f@DECI = @TIME - @COUNT;
//relation//
f@S = (360/@MS)/@SF;
f@M = @S/@HM;
f@H = @M/@DH;
f@SH = (@IH + (@IM / @HM) + ((@IS /@ MS) / @HM)) * (360 / @DH);
f@SH = (@IH + (@IM / @HM) + ((@IS / @MS) / @HM)) * (360 / @DH);
f@SM = (@IM + (@IS / @MS)) * (360 / @HM);
f@SS = @IS*(360 / @MS);
f@AS = (@COUNT*@FPS)*@S;
f@AM = (@TIME*@FPS)*@M;
f@AH = (@TIME*@FPS)*@H;
f@FS = @SS+@AS;
f@FM = @SM+@AM;
f@FH = @SH+@AH;
- point(surface_node, point_number, attribute, index)
- surface_node: null(info)의 경로
- point_number: 0번 점
- attribute: FS, FM, FH
- index: 하나의 값 = 0 (첫 번째 정보)
- Attribute Wrangle에 파라미터를 만들어서 편리하게 통제하자 ➡ ch( ) 활용
- Input time의 입력값을 채널 펑션으로 수정
- 시간은 integer 속성이지만, float 속성으로 진행
- ch(“파라미터 이름”)
- Attribute Wrangle에 작성한 f@DECI의 값을 [Carve] – [First U]값에 넣는다.
- DECI값으로 움직이는 (떼어낸) 0번점의 높이를 반동에 대한 Attribute로 이용할 것이기 때문에 Attirbute Wrangle로 Attribute화 시킨다.
f@VIBE;
@VIBE = @P.y;
- 반동을 만든 Attribute Wrangle노드와 info 노드를 하나로 묶어준다.
- 먼저, info를 Attribute Wrangle의 input1 연결한다.
- 반동을 만든 Attribute Wrangle을 새로 만든 Attribute Wrangle의 input2에 연결한다.
- Point( )으로 새로운 Attribute Wrangle에 불러와야한다.
f@VIBE;
@VIBE = point(1,"VIBE",0);
- 이미 있는 정보를 불러올 때 타입캐스팅은 하지 않아도 된다.
@FS = @FS+@VIBE;
- Null(info)에 있는 Rotation: z값을 최종 코드로 업데이트 해야 하므로 새로운 Null을 연결하고 경로를 수정한다.
- 반동의 크기를 조절하기 위해 mult 코드 추가하고 채널 펑션으로 만든다.
- 하나의 노드에서 조절하기 위해 CLOCK_SYSTEM 노드를 만든다.
- 시작 시간 입력을 위한 Float Vector 3 속성의 INPUT_TIME 파라미터 추가
- 시, 분, 초의 관계 설정을 위해 Float Vector 4속성의 RELATION 파라미터 추가
- 반동 설정을 위해 Float 속성의 MULT 파라미터 추가
- CLOCK_SYSTME에 생성된 파라미터들을 Copy Parameter하고 Attribute Wrangle에서 만들었던 값들에 Paste Relative References
필요한 부분만 Attribute로 만들어 보자
- 변수를 한번에 선언
- 관계 작성
- 결과로 활용해야 하는 부분을 Attirbute로 만들기
Attribute VOP으로 시계 애니메이션 만들기
- Add노드에 점을 만들고 [Attribute VOP] – [Run Over: Points] 연결
- VOP 안으로 들어와서 Parameter 생성, 채널의 속성 float을 Type에서 선택
TIME = @Frame / FPS
COUNT = floor(TIME)
DECI = TIME - COUNT
S = (360 / MS) / SF
M = S / HM
H = M / DH
SH = (IH + (IM / HM)) + ((IS / MS) / HM)) * (360/DH
SM = (IM + (IS / MS))) * (360 / HM)
SS = IS * (360 /MS)
AS = (COUNT * FPS) * S
AM = (TIME * FPS) * M
AH = (TIME * FPS) * H
- 굉장히 복잡한 노드가 생성되었다.
- 마지막 결과값을 따로 작업하기 위해 새로운 Attribute VOP을 생성해 연결한다. ➡ 이전 Attribute VOP의 정보를 그대로 승계한다.
- 필요없는 VOP노드를 bypass에서 꺼준다.
- 필요한 Attirbute는 Bind 노드로 불러온다.
FS = SS + AS
FM = SM + AM
FH = SH + AH
- Attirbute VOP으로 만든 값을 시계침의 Transform의 Rotation값에 point( )으로 불러온다.
- Carve에 Deci값 point( )으로 불러온다.
- 반동 P.y값 Attribute VOP로 불러와 Attirbute를 만들어준다.
- Position에 존재하는 x, y, z값에서 y값만을 VIBE Attirbute로 만들어주기 위해 Vector to Float으로 y값을 추출하고 Bind Export로 VIBE Attirbute 만들기
- 시계침과 반동을 Attribute VOP 노드로 묶기
- Opinput: Attribute VOP노드의 input순서와 같다
- 불러오고 싶은 순서에 있는 input에 Import Point Attribute를 연결한다.
- 그 정보의 속성을 설정: [Signature: Float]
- Bind Export로 확인
- Attribute에 Null(CLOCK)노드를 연결한다.
- 반동을 주기 위해 Attirbute VOP에 파라미터 MULT를 만든다.
- 최종값을 가진 CLOCK노드로 Transform의 Rotate의 경로를 수정한다.
FBX 모델링에 각각 VEX와 VOP로 만든 시스템을 연결하면 완성..!?
완성..을 하고 싶었으나 VOP에서 오류가 발생했다.
일기를 쓰면서도 계속 확인해보았으나 결국 찾지 못하였다.
그리고 파일을 날렸.......(저장과 백업을 생활화 합시다...😂)
주말에 다시 한 번 Attritbue VOP로 시스템 만들기를 복습해야겠다.