고등학생때 2차원 회전 행렬을 응용해서 풀어야 했던 문제가 있었던게 어렴풋이 기억이 난다.
2차원 회전 행렬은
특정 각만큼 회전시켰을때 기존 좌표를 삼각함수로 연산하여 회전된 좌표를 구한 식을
행렬로 표현한 것이라고 할 수 있다.
이와 약간은 다르게 3차원 회전 행렬은 축기준으로 회전을 하게 된다.
X축을 기준으로 회전하면, X값은 변치 않고 Y,Z값만 수정되며,
Y축을 기준으로 회전하면, Y값은 변치 않고 X,Z값만 수정되며,
Z축을 기준으로 회전하면 Z값은 변치 않고 X,Y값만 수정된다.
이때 중요한 점은 특정 축을 기준으로 회전하기에, 수정되는 좌표는 어디까지나 2개의 좌표이므로,
2차원 회전 행렬 개념을 그대로 적용해서 연산을 수행한다고 볼 수 있다.
또한 최종 연산 결과가 여러 축을 기준으로 회전을 수행하게 되는 것이라면, 행렬의 곱으로 결과를 누적 시켜
반영할 수 있다. 이를 오일러 회전이라고 한다.
곱 자체는 3가지 축을 기준으로 회전한다고 볼 수 있기에
XYZ, XZY, YXZ, YZX, ZXY, ZYX 이렇게 6가지 정도로 볼 수 있겠다.
한 두가지만 도출해보겠다.
연산 순서에 따라 꽤 많은 차이를 보인다는걸 알 수 있다.
XYZ순으로 회전행렬을 곱했을때를 디테일하게 설명해보겠다.
일단 XYZ순으로 회전행렬을 곱하게 되면, Z->Y->X 순대로 회전을 한다고 생각하면 된다.
Z축이 회전할땐, Y,Z축이 Z축을 따라 회전하게되고,
Y축이 회전할땐, 이미 Z축만큼 회전된 상태인 축을 기준으로 삼게되며, 먼저 회전했던 Z축은 변하지 않고 X축만이 Y회전값 만큼 회전하게 된다.
마지막으로 X축이 회전할땐, 다른 축에 영향을 주지 않고 X축이 회전하게 된다.
요악하자면 회전 순서에 따라 축의 종속 관계가 맞춰 변경된다고 할 수 있겠다.
하지만 위 방식으로 해결하게 될 경우 오일러 각을 이용한 회전은 각 축마다 순차적으로 값을 곱하는데
계산 결과 오브젝트의 두 회전 축이 겹치는 현상이 일어나게 된다. 이를 짐벌락이라고 한다.
그렇기에 오일러 각을 사용하여 회전했을 때에는 좌표축 방향이 바뀐다는 것을 유의하여야 한다.
roll(z축), pitch(x축), yaw(y축)을 이용하여 회전하는데
roll을 이용해 z축을 기준으로 회전했다면 회전 결과 x축과 y축 방향은 이전과 달라진다.
→ 회전을 적용하는 순서가 중요하다.
즉 오일러 각의 회전은 교환법칙이 성립하지 않는다는 뜻이다.
짐벌락 현상을 해결하기 위해서는 회전 계산을 세번에 나눠 계산하지 않고
한번에 계산할 수 있는 쿼터니언을 사용하여야 한다.
'Programming > Game-Math' 카테고리의 다른 글
벡터 내적 공식 유도 (0) | 2019.12.18 |
---|---|
카메라의 뷰 좌표계와 LookAt 행렬 유도 (0) | 2019.12.18 |
선형 변환(Linear Transformation)과 행렬(Matrix)의 관계 (0) | 2019.12.08 |
C++ PreCompiled Header (0) | 2019.11.25 |
Singleton Pattern, Lazy Initialization (0) | 2019.11.04 |