vex - Rubiks cube 분석
우선 먼저 이 글은 cgwiki의 'Rubirks cube' 파일을 기반으로
분석한 글임.
1. 좌표를 먼저 생성. copy stamp 에 쓸 좌표.
2. attribute wrangle 생성한 후에 @orient를 생성.
@orient는 4개의 float 값을 가지는 벡터값이며 축과 각도를 한 꺼번에 표기할 때 쓰인다.
ex) {0,0,1, 45} == z축으로 45도 기울인다는 의미.
3. wrangle을 하나 더 생성. 그리고 다음과 같이 코드 생성.
float t;
float speed = 2;
t = @Time;
t *= speed;
int randaxis = int(rand(floor(t),123)*3);
int randslice = int(rand(floor(t),456)*3);
float randdir = sign(fit(rand(floor(t),789),0,1,-1,1));
vector axis = {0,0,0};
if (randaxis==0) axis = {1,0,0};
if (randaxis==1) axis = {0,1,0};
if (randaxis==2) axis = {0,0,1};
float slice = 0;
if (randslice==0) slice = -0.5;
if (randslice==1) slice = 0;
if (randslice==2) slice = 0.5;
matrix3 m = ident();
float angle;
angle = randdir*$PI/2*@TimeInc*speed;
rotate(m, angle, axis);
if (abs(sum(@P*axis) - slice) <= 0.001) {
@P *= m;
@orient = qmultiply(quaternion(m), @orient);
}
차근차근 분석해보자...
이 코드는 어느 행, 어느 줄을 기준으로 잡을지 그리고 그것을 어느 방향으로
돌리는지 랜덤으로 정하는 코드다.
우리가 봐야하는 것은 값이다. 이것을 확인하려면 @밸류로 생성해서 스프레드시트로
확인 해보면 된다.
0, 1, 2의 일정 프레임미다 랜덤하게 값이 결정됨.
여기서floor는 정수만 반환함. 소수점 소멸.
rand는 0과 1사이의 랜덤값을 조절.
위 랜덤값을 기반으로
randaxis가 0일땐 x축, 1일 땐 y축, 2일 땐 z축으로 결정.
randslice가 0일땐 아랫줄, 1일땐 중간줄, 2일때 윗줄로 결정.
여기서 m의 의미는 메트릭스(병렬)형의 변수를 정의하는 것임.
그래서 주로 ident();를 사용하는데 이것은 곧 기본 디폴트가 됨.
한 마디로 m = {{1,0,0},{0,1,0},{0,0,1}} 과 같음.
angle은 말 그대로 각도. randdir는 각도 크기를 의미함.
우리가 봐야할 것은 그 밑줄 부터인데 rotate 함수의 의미는 메트릭스(m)의 값에
angle(각도)만큼 axis(축)에 rotate(돌림)한 값을 적용시킴.
그래서 @P *= m; 을 하면 축에 각도만큼 돌아간 것을 확인 가능함.
한 마디로 rotate으로 해당 m의 값을 변경시키고
그 변경된 값을 포인트에 곱해서 적용해야 오브젝트를 원하는 만큼 rotate할 수 있음.
if(sum(@P*axis) == slice)) 부분은
sum은 그 컴포넌트의 합해서 float값으로 변환함. 한 마디로 벡터의 속성값을
다 더한 후 float으로 변환함.
지금 보면 매개변수는 @P*axis이고 이는 곧 axis {0,0,1}, {0,1,0}, {1,0,0}에 따라서
@P의 x,y,z 하나만 가져올수 있음.
그리고 slice 값과 비교하여 값이 같으면 @P를 rotate함
댓글
댓글 쓰기