이것 저것 개발하고 만들어보기
article thumbnail

 

 

 

 

3D 애니메이션을 제작 할 때 오브젝트의 회전은 매우 중요한 요소입니다.

 

 

 

 

 

 

애니메이션에선 물체의 키와 키 사이에 자동으로

 

상태를 매워주는 것을 보간(Interpolation)이라고 합니다.

 

보간 덕분에 3D 소프트웨어를 사용한 애니메이팅을 할 때

 

특정 프레임에만 애니메이션 키를 찍어도

 

애니메이션을 표현할수 있는 이유이기도 합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Euler(이하 오일러)는 3개의 축에 대한 각도를 회전 정보로 이용합니다.

 

공간에서의 임의의 방향은 세번의 회전을 통해서 얻을 수 있으며

 

이러한 방식을 잘 보여주는 것이 흔히 자이로스코프라고 많이 알려진

 

위 사진과 같은 짐벌(Gimbal) 장치 입니다.

 

 

 

 

짐벌 장치에서 Yaw, Pitch, Roll 같은 세가지 회전을 담당하는 관절이 존재합니다.

 

사진기의 트라이포드(Tripod) 기기가 대표적인 예 이며 비행기 등의 항공장치에서도 사용됩니다.

 

 

 

 

 

3D MAX 에서는 Yaw, Pitch, Roll 축이 존재하는 짐벌을 X, Y, Z 로써 표현합니다.

 

사진은 3D MAX에서 기즈모라고 불리는 오브젝트 제어 컨트롤러를 시각적으로 표현한 것으로

 

빨간색은 X축, 초록색은 Y축, 파란색은 Z축을 의미합니다.

 

축은 3D MAX 가 가지고 있는 기본적인 축인 월드(World)축과 

 

오브젝트가 가지고 있는 고유의 축 로컬(Local)축이 존재합니다.

 

 

 

 

 

 

 

 

 

 

3D MAX 에선 3차원 공간을 각 X, Y, Z로써 표현합니다. 회전도 마찬가지로 좌표계가 X, Y, Z입니다.

 

또한 오일러 각에 의한 회전은 오브젝트의 로컬 좌표계(로컬 축)를 기준으로 합니다.

 

사진과 같이 오브젝트의 방향을 다음과 같이 정의할 수 있습니다.

 

 

  • α (또는 ψ): z-축(파란색)을 회전축으로 하여 회전된 x-y 좌표축의 각도

 

  • β (또는 θ): 회전된 x-축(즉, N-축, 녹색)을 회전축으로 하여 회전된 z-y 좌표축의 각도

 

  • γ (또는 φ): 위에서 회전된 z-축(즉, Z축, 빨간색)을 회전축으로 하여 회전된 x-y 좌표축의 각도

 

 

 

 

이는 기준 축이 어떤 축이냐에 따라 나머지 좌표의 축도 같이 변화됩니다.

 

만약 Y축(Pitch) 기준으로 회전했다면 나머지 X(Yaw), Z(Roll) 의 축도 같이 변화하게 됩니다.

 

 

 

 

 

 

 

오일러 회전에서 유의해야 할 점은, 이러한 회전이 순서를 거쳐서 최종 방향이 결정되는 것 입니다.

 

 

 

 

 

 

모션탭 Rotation 패널에 Euler Parameters

 

이 순서가 영향을 끼치는 것을 쉽게 알수 있는 방법은 실제로 회전 순서를 바꿔 보는 것 입니다.

 

Euler는 주 3D MAX에서 정해진 주 축의 회전 말고도 임의의 기준축을 정하고 회전이 가능합니다.

 

이는 회전이 적용되는 순서를 바꾸는 것으로, 애니메이팅 된 회전의 순서를 바꾸면 다른 결과가 나옵니다.

 

 

 

왼쪽부터 XYZ, YXZ, ZYX 로 Axis Order 가 바뀌어 있습니다.

 

모두 동일하게 X -50, Y 30, Z 50 으로 회전하였지만,

 

Axis Order 에 따른 회전이 조금씩 바뀐것을 알 수 있습니다.

 

이렇듯 회전 순서에 따른 결과값도 달라질수 있으며 특정 회전값을 얻기 위해서는

 

회전 순서에 따른 애니메이팅도 고려해야 합니다.

 

 

 

 

 

 

또한 오일러 회전으로 애니메이팅을 하다보면 사진과 같이 의도한 대로 움직여지지 않는 경우가 많이 발생합니다.

 

이는 짐벌락(Gimbal Lock) 이라고 하는 현상으로,

 

오일러 회전을 사용해 애니메이팅 하면 반드시 발생하는 상황입니다.

 

 

 

 

 

 

두 링이 같은 각도로 겹쳐져 있는 모습.

 

 

 

 

기본적으로 오일러 회전은 오일러 각에 의한 3축을 기준으로 회전합니다. (3D 공간 기준)

 

오브젝트를 회전시키면, 해당 방향의 축이 회전하면서, 다른 축과 겹쳐지게 됩니다.

 

이렇게 되면 겹쳐진 축은 회전축으로써의 역할을 상실한 상태

 

즉, 축이 잠겨버렸다는 의미에서 Gimbal-Lock(짐벌락) 상태가 됩니다.

 

 

 

 

 

 

또한 오일러의 이러한 구동 방식은 반드시 짐벌락 상태가 아니더라도

 

회전의 보간이 미묘하게 어긋나게 됩니다.

 

특히 잠겨진 축에 의한 회전 보간은 더욱 더 어긋나게 되어, 우리가 의도한 결과와는

 

완전히 다른 결과를 보여 줄 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

사진과 같이 짐벌락이 걸린 오브젝트를 원하는 방향으로 회전시키고자 할 때,

 

동시에 3축이 같이 움직이면 Y 축과 같은 방향으로 겹쳐진 Z축이 원래자리로 되돌아가려고 하면서

 

애니메이터가 의도하지 않은 엉뚱한 방향으로 회전하는 모습을 볼 수 있습니다.

 

 

 

좌측은 Axis Order 가 XYZ일 때, 우측은 Axis Order가 YXZ일 때 화살표가 위를 보게 만들었습니다.

 

 

이러한 짐벌락 현상을 피하는 것은 회전 순서를 바꿔주는 것 입니다.

 

오일러 각은 기준이 되는 회전 축에 따라서 나머지 축도 같이 회전하게 됩니다.

 

회전이 가장 많이 일어나는 축을 기준축으로 삼고, 나머지 축이 비교적 적게 회전하는 순서로

 

회전 순서를 바꾸거나 같이 회전할 오브젝트의 계층 구조를 바꾸면

 

오브젝트의 짐벌락 현상을 일시적이나마 피할수 있습니다.

 

 

 

 

 

우측 화살표 모양과 같이 짐벌락이 걸리지 않은 회전도 미묘한 어긋남이 보입니다.

 

앞서 설명했듯이, 이는 오일러의 구동방식이면 반드시 발생하는 현상이며,

 

짐벌락 상황의 경우에 더 극명한 차이를 보여줍니다.

 

 

 

 

 

 

 

Axis Order를 바꿔줌으로써 짐벌락 상황을 피할수 있을 뿐, 짐벌락 문제는 완전히 해결된것이 아닙니다.

 

회전 순서가 바뀌면 다른 각도의 짐벌락 문제가 계속해서 존재하게 되기 때문에

 

짐벌락 문제를 완전히 피하기란 어렵습니다.

 

심지어는 회전 순서가 바뀌면 같은 값이라도 결과가 달라질 수 있기 때문에

 

임의의 방향으로 바라보고자 오브젝트를 회전시킬려면

 

회전 순서에 따라 오브젝트마다 회전값을 다르게 입력해 주어야 합니다.

 

 

 

 

 

오일러 일때 커브 에디터의 베지어 곡선.

 

이럼에도 오일러 회전이 소프트웨어에서 가지는 또다른 특징은 각 회전별로

 

커브 편집이 용이하다는 점에 있습니다.

 

이러한 커브 편집이 애니메이션 편집에 가장 강력한 도구로써 활용되고 있으며,

 

보다 직관적이고 타이밍을 조절하기 쉽다는 장점이 있습니다.

 

 

 

 

 

 

오일러가 가지는 큰 단점을 보완하기 위해 MAYA 에서는 채널 에디터를 통해

 

애니메이션 중간에 Axis Order를 바꾸어 주어서 타이밍별로 짐벌락을 피한다거나,

 

Quaternion 이라는 오일러 회전과는 완전히 다른 방식의 공간의 회전을 정의합니다.

 

Quaternion 회전으로 짐벌락 문제를 해결해 애니메이팅을 하기도 합니다.

 

다음 게시물에선 이러한 짐벌락 문제가 해결된 Quaternion 을 다루고자 합니다.

 

 

 

 

 

 

 

 

 

 

 

참고자료

 

위키백과 : 오일러 각 https://ko.wikipedia.org/wiki/%EC%98%A4%EC%9D%BC%EB%9F%AC_%EA%B0%81

 

GuerrillaCG 의 유튜브 영상 'Euler (gimbal lock) Explained'

 

캐릭터 셋업 테크닉 (저자 이상원)

 

 

 

 

'Theory > Animation Theory' 카테고리의 다른 글

[3D Animation 원리] Quaternion(쿼터니언), TCB  (0) 2021.07.06
profile

이것 저것 개발하고 만들어보기

@Tintana'k