안녕하세요.
애니메이터가 들려주는 맥스 스크립트의 스크립팅하는 애님입니다.
오늘도 오브젝트의 Transform에 대해서 얘기해 보도록 하겠습니다.
오늘은 미뤄 왔던 회전에 대해서 이야기해 보겠습니다.
Quaternian
우선은 박스를 하나 만들어 보겠습니다.
지금까지 알아 왔던 것과는 다른 다른 형식인 (quat 0 0 0 1)으로 표기됐습니다.
Quaternian(쿼터니언, 사원수)라는 값인데 회전 값을 표현하는 방법 중 하나이며 그중에 가장 복잡한 형태입니다.
사원수란
'수학에서, 사원수(四元數, 영어: quaternion 쿼터니언[*]) 또는 해밀턴 수(영어: Hamilton number)는 복소수를 확장해 만든 수 체계이다. 네 개의 실수 성분을 가지며, 덧셈과 곱셈의 결합법칙 및 덧셈의 교환법칙을 만족시키지만 곱셈의교환 법칙은 성립하지 않는다.
따라서, 비가환대수이다.'
라고 위키피디아에 나왔습니다.
이것 역시 매트릭스와 같이 3D툴에서는 자주 사용되는 회전 값의 형태이고 알아두면 도움이 되지만 제가 잘 모르고 사용하기 않기 때문에 이런 것이 있다고 얘기하고 패스 하겠습니다. ㅎㅎㅎ
angleAxis
위에 쿼터니언이 회전 값을 표현하는 방법 중 하나라고 했으니 다른 방법도 있습니다.
다음과 같이 입력하고 다음과 같이 이어서 입력하고 라인 실행을 해봅시다.
|
3
|
(myBox.rotation) as angleAxis
|
cs |
맥스 스크립트에서 'as ~'라고 작성하면 '~'형태로 변경하라는 것이지요.
기본적으로 회전 값이 쿼터니언인데, 이것을 그나마 우리가 알 수 있는 angleAxis(앵글 액스) 방식으로 변경하라는 것입니다.

결과 값이 이상하게 보이네요.
이것 역시 제가 자주 사용하는 방식은 아니지만 제가 알고 있는 데로 설명을 하겠습니다.
(angleAxis 0 [0,0,0])에서
angleAxis은 회전 값을 표현하는 방식 중에 angleAxis을 사용한다는 뜻이고,
다음으로 오는 0은 회전각을 나타냅니다.
다음으로 오는 [0,0,0,]은 x, y, z를 나타 냅니다.
간단히 예를 들어 x축으로 90도만큼 회전 시킨다면 다음과 같이 쓸 수 있습니다.
|
1
|
myBox.rotation = angleAxis 90 [1,0,0]
|
cs |

x축을 기준으로 90도 만큼 회전했습니다.
내용을 한 번 더 짚어 보자면 90도만큼 x축을 1만큼 회전을 한다는 뜻입니다.
같은 원리로 angleAxis 45 [1,0,1]라던가 할 수 있습니다.
그런데 정확하게 같은 각도로 회전하지 않았다면 어떻게 나올까요?

위 그림과 같이 적당히 회전시키고,
다음과 같이 이어서 입력하고 라인 실행을 해봅시다.

뭔가 알 수 없는 값이 나와 버렸습니다.
이해하기 위해 들여다보면
235.227도 만큼 x축으로 -0.953905, y축으로 0.208204, z축으로 -0.216139만큼 회전했다는군요.
표현이 되기는 합니다.
단지 알아먹지 못해서 그렇죠.
eulerAngles
그렇기 때문에 일반적으론 eulerAngles(오일러)방식을 사용합니다.
다음과 같이 이어서 입력하고 라인 실행을 해봅시다.
|
6
|
(myBox.rotation) as eulerAngles
|
cs |

좀 복잡해 보이지만 기존에 배운 pos, scale과 비슷한 형태입니다.
eulerAngles는 회전 값의 표현 방식이 eulerAngles형이라는 것이고 뒤의 값들은 x값, y값, z값을 나타냅니다.
우리가 알고 있는 각도로 표기되며 x축으로 -120.19도 만큼 회전하고, y축으로 -8.7859만큼 회전하며, z축으로 -29.6849만큼 회전한다는 것입니다.
그럼 원래 박스가 생성됐을 때의 각인 0, 0, 0으로 만들어 봅시다.
다음과 같이 이어서 입력하고 라인 실행을 해봅시다.
|
7
|
myBox.rotation = eulerAngles 0 0 0
|
cs |

(eulerAngles 0 0 0)라고 잘 적용이 됐습니다.

그리고 뷰포트상에서도 정확하게 회전했습니다.
지금까지 배운 회전은 절대기준으로 한 회전이었습니다.
오늘도 상대 기준의 회전까지 배워 보도록 하겠습니다.
지금까지 열심히 이야기를 들으신 분들은 대충 감이 올 겁니다.
다음과 같이 이어서 입력하고 라인 실행을 해봅시다.

어이쿠!! 에러가 떴습니다.
대충 읽어보니 rotate는 인자 값이 3개 필요한데 5개나 있다네요.
rotate 노드 회전 값
얼래? 인자가 '노드'와 '회전 값'두 개가 필요한데요.
저도 잘 이해가 가진 않지만, 어쨌든 인자의 개수가 다르답니다.
다음과 같이 바꿔서 라인 실행을 해봅시다.
|
1
|
rotate myBox (eulerAngles 30 0 0)
|
cs |
별다른 것은 아니고 양쪽에 괄호로 해서 묶어 주었습니다.
이렇게 괄호로 묶어 버리면 괄호 안쪽의 값이 계산된 후 나온 값을 하나로 인식하게 됩니다.

예쁘게 30도 회전했습니다.
방금 실행한 라인을 다시 한번 실행합시다.

절댓값으로 회전한다면 변화가 없어야 하지만 상대 값으로 회전했기 때문에 30도 더 회전을 하는군요.
오늘은 오브젝트의 Transform 중 회전에 대해 알아봤습니다.
다음에는 Transform의 기준을 바꾸는 방법에 대해서 알아보겠습니다.
'맥스스크립트 기초' 카테고리의 다른 글
| 함수(1) (3) | 2019.08.11 |
|---|---|
| Color Values (0) | 2019.08.02 |
| 오브젝트의 옵션 (0) | 2019.07.18 |
| 오브젝트의 Transform (4) (0) | 2019.07.17 |
| 오브젝트의 Transform (2) (0) | 2019.07.15 |
| 오브젝트의 Transform (1) (2) | 2019.07.14 |
| 기본 오브젝트 만들기 (1) | 2019.07.12 |
| 맥스스크립트의 알아두면 좋은 것 (0) | 2019.07.12 |

