본문 바로가기
기타 개발 관련/3D 그래픽스

3D 그래픽스 - 회전행렬 / 오일러각 / 축 각 표현

by 번데기 개발자 2018. 6. 23.
반응형


3차원에서의 물체의 위치




물체의 오리엔테이션은 매우 중요합니다.

만약 부메랑과 같은 어떤 물체를 던졌다면 단순히 물체의 위치만 이동하는 것이 아니라, 

물체가 돌면서 날아가기 때문에 물체가 바라보는 방향(오리엔테이션)도 변하는 것이 자연스럽습니다.



카메라나 물체의 이동경로는 이동변환에 의해 쉽게 구현할수 있습니다.

그러나 물체 오리엔테이션의 변화는 오리엔테이션의 변화가 회전변환에 이루어진다는 점때문에 회전변화에 있어서 적절한 보간이 이루어져야 합니다.



이와 같은 회전을 표현하기 위해서는 3가지의 방식이 있습니다.






(1) 회전 행렬 표현





기하 변환중 회전을 표현하기 위한 방법중 하나가 행렬입니다.

단순한 정점좌표에 행렬을 곱하면 변환작업이 완료된다는점과, 연속된 변환을 하나의 복합행렬로 나타낼 수 있다는 점이 행렬 표현의 장점입니다.



위에서 우변의 회전행렬 [x, y, z]의 특성은 각 칼럼을 벡터로 간주 할 때 모든 칼럼이 단위 벡터라는 특성이 있습니다.

예를 들어 첫번째 칼럼벡터의 길이는 






입니다.


또한 칼럼벡터 상호간의 내적은 0입니다.


단위 벡터의 특성을 정규성(Normality), 수직인 특성을 직교성(Orthogonality)라 부르고 두가지 특성을 합쳐서 정규 직교성(Orthonormality)라고 부릅니다.

3*3 행렬에 모두 9개의 계소를 자유롭게 넣을수 있어야 하지만 정규 직교성으로 인한 6개의 제약조건을 만족해야 하므로 실제로 자유도는 3에 불과 합니다.

3개의 자유도를 9개의 계수로 나타내는 것은 메모리 저장공간 면에서 매우 비효율적이라고 생각 할 수 있습니다.


다른 단점으로는 바로 표류(Drift)입니다. 예를 들어 각도를 조금씩 증가하면서 연속된 회전을 가할경우 새로운 회전행렬을 직전 행렬에 곱해서 새로운 복합행렬을 만들 수 있습니다.

이 경우에 복합행렬에는 부동소수 연산으로 인한 오류가 누적되고 그 결과 정규 직교성을 만족하지 못하게 될 수 있습니다.

그 결과로 원치 않게 물체의 크기조절이나 변환이 가해짐으로써 강체의 모습을 잃어버릴 수도 있게 됩니다.







(2) 오일러 각







오일러각의 3개의 각도만으로 회전을 표현한 것을 말합니다.








위의 비행기를 예로 들자면 z축 기준의 회전각을 roll, x축 기준의 회전각을 pitch, y축 기준의 회전각을 yaw라고 가정하겠습니다.
(현재 OpenGL 문언을 참고하였기때문에 회전각의 표현이 조금 다릅니다.)

실제 오일러 각을 적용하기 위해서는 최정적으로 회전 행렬로 변환하여야 합니다.



그렇지만 오일러각에 의한 표현은 자유도 3에 3개의 계수를 저장하기 때문에 저장 공간 면에서는 유리하다는 장점이 있습니다.

회전각 자체를 그대로 저장하므로 표류(Draft)의 문제도 없어집니다.

x, y, z축 기준의 회전각을 각각 a, b, r이라고 하면 x, y, z축을 기준으로 순차적으로 회전한 결과는 다음과 같습니다.








어떤 회전이라도 3개의 오일러 각으로 표현 할 수 있게 됩니다.

주축 회전이 아닌 임의의 축을 중심으로 회전하려면 해당 축을 주축 요소들로 분해한 다음 주축 회전을 가하면 됩니다.


오일러 각에의한 회전은 항상 물체의 현재 모델 좌표계를 기준으로 합니다.

이 경우 유의해야 할 점은 회전의 결과 좌표축 방향이 바뀐다는 점입니다.


위 비행기 그림을 예로 들면 롤링에 의해 z축을 기준으로 회전했다면 회전 결과 모델 좌표계의 x, y 축 방향은 이전과는 달라지게 됩니다.

이는 회전을 적용하는 순서가 중요함을 의미합니다.

일반적으로 x축 기준으로 a, y축 기준으로 b 만큼 회전한 결과는 y축 기준으로 b, x축 기준으로 a만큼 회전한 결과와 일치하지 않게 됩니다.

즉 회전에 있어서는 교환법칙이 성립하지 않는다는 뜻입니다.


오일러 각 표현에서 회전을 보간하기 위해서는 오일러 각 자체를 보간하여야 합니다.

물론 (x, y, z) 또는 (x, z, y) , (y, x, z) 등 임의의 축 순서를 정해서 축별로 점차 회전각을 증가 시킬 수도 있습니다. 

그러나 이경우 오일러의 각 표현은 몇가지 문제점이 발생하게 됩니다.


첫번째로 복합 변환의 결과을 예측하기 어렵게 됩니다.

예를 들어, 어떤 물체를 오일러 각(10도, 20도, 30도)에 의해 회전하고 이어서 회전한 좌표축을 기준으로 다시 (40도, 50도, 60도)로 회전할 경우 이는 원래 물체를 (50도, 70도, 90도) 로 회전한 결과와는 다르게 됩니다. 

그 이유는 이미 첫번째 회전변환에서 좌표축의 방향이 변했기 때문입니다.


1)                                                                                                    2)

                                          








(2) 의 첫 그림에서 x, y, z축이 직교함을 볼 수 있습니다. 
(x축은 새총의 쏘는 방향 z축은 새총의 윗부분거치대, y축은 새총의 손잡이)

이 상태에서 x축을 기준으로 일정 각도를 회전했다고 가정하고 이어서 z축을 기준으로 90도 회전하면 두번째 그림의 모습처럼 x축과 y축이 나란해 지기 됩니다.

따라서 현재 상태에서 y축을 기준으로 회전을 가하면 이는 이전에 x축을 기준으로 회전한 각도에 영향을 미치게 됩니다. 

즉 x축과 y축이 곂쳐버렸다는 의미입니다.


이는 오일러각 표현의 자유도 (DOF)가 3에서 2로 줄어들었다는 것을 의미합니다. 

즉 회전결과 모델 좌표축의 방향이 변하기 때문에 x, y, z 축 기준의 회전이 더이상 독립적이지 않고 곂치게 되므로 x, y 축이 의존적 (한축이 움직이면 다른축이 영향을 받게되는) 으로 변하게 된다는 것입니다. 

이를 짐벌락 현상이라고 합니다.

물론 짐벌락 현상은 x, y, z 축을 기준으로 90도 회전하는 특수한 경우에 발생하지만 그 결과 회전은 더이상 3차원 공간의 회전이 아니라 2차원 평면의 회전으로 변하게 되어 매우 부자연 스러운 모습이 됩니다.






(3) 축 각 표현





오일러 각은 모델 좌표계의 x,y,z 축을 기준으로 합니다.

그러나 일반적으로 이처럼 고정된 축방향을 기준으로 하는 회전을 원하는 경우는 적습니다.

오히려 개발자들은 임의의 축 방향을 기준으로 물체가 회전하기를 원하게 됩니다.

임의의 회전축을 기준으로 하는 회전을 x, y, z에 대한 회전의 합성으로 표현한다고 하더라도 변화 과정을 직관적으로 알기 어려워 집니다. 

이러한 부분을 보완한 조금 더 직관적인 회전 표현인 축-각(Axis-Angle)표현에 대해 설명하겠습니다.








축-각 표현에서는 회전축과 회전각을 사용합니다.

위 그림의 x, y, z는 물체 모델 좌표계의 좌표축입니다.

축-각 표현에서 회전축은 임의로 지정할 수 있으며 이는 모델 좌표계 원점에서 시작하는 단위 벡터 n(nx, ny, nz)로 나타냅니다.

회전각은 이 축을 기준으로 회전할 각도를 반 시계 방향으로 나타낸 것입니다.




참고


반응형