3차원 변환은 2차원 변환과 거의 흡사합니다.
대부분이 동일하며 1차원이 증가했다는 것이 차이점입니다.
2차원 : (x, y) ==> 3차원 : (x, y, z)
[3차원에서 동차 좌표]
3차원에서의 동차 좌표 (x, y, z, w)
동차좌표 정규화 또한 2차원과 동일합니다. (x/w, y/w, z/w, w/w)
3차원을 계산하기 위해서는 외적에 대해 알아야합니다.
외적은 두 벡터에 동시에 직각인 벡터를 구할 수 있습니다.
외적의 결과가 위와같이 나온다면 오른손의 법칙을 따라야 합니다.
[3차원 이동 변환 행렬]
[3차원 크기 조절 변환 행렬]
[3차원 회전 변환 행렬]
3차원에서 이동과 크기 조절은 2차원과 크게 차이가 없습니다.
하지만 3차원 회전은 차이가 조금 있습니다.
2차원에서는 원점을 기준으로 회전만 하면 됐습니다.
하지만 3차원에서는 회전축이 3개나 있기 때문에 회전축에 따라 회전 행렬이 달라집니다.
<X축 기준으로 회전>
<Y축 기준으로 회전>
<Z축 기준으로 회전>
2차원과 동일하게 모든 회전은 원점을 중심으로 회전합니다.
아래 그림처럼 회전시킬 오브젝트의 중심점을 원점에 일치시킨 상태로 회전을 진행해야 합니다.
*교환법칙 성립하지 않음
RㆍT 와 TㆍR은 일반적으로 서로 다른 결과
// R = 회전 변환 행렬, T = 이동 변환 행렬
만약 임의의 축으로 회전을 하고 싶다면 세가지 방법이 있습니다.
- Axis Angle
- Euler Angle
- Quaternion
[Euler Angle]
오일러 각은 회전을 쪼개서 생각하는 것입니다. 3차원의 회전을 세 개의 축에 대한 회전의 중첩으로 이해하는 방식입니다.
하지만 이렇게 진행하면 회전 순서에 따라서 결과가 다르게 나오게 됩니다. 따라서 오일러 각을 사용할 때는 어떤 순서로 회전을 진행하였는지 표기해주어야 합니다.
하지만 순서의 표기가 생략된 오일러 각을 많이 접할 수 있습니다. 이 경우 yaw-pitch-roll 회전이라고 간주하면 됩니다.
항공 공학에서 사용하는 좌표계로 Z-Y-X 순서로 회전을 한다는 의미입니다.
오일러 각은 직관적이라는 장점이 있지만 짐벌 락(Gimbal Lock)과 회전각에 대해 interpolation 문제가 있습니다.
짐벌 락은 오일러 각을 통해 회전을 하게 되는 경우 어느 축이든 +90º, -90º 회전을 하게되면 축이 겹치게 됩니다.
또한 오릴러 각에서 2개 이상의 축을 사용해 회전을 하게 되는 경우 선형 보간(linear interpolation)을 통해 회전 변환을 부드럽게 표현할 수 없습니다.
[Axis Angle]
축-각 회전(Axis-Angle rotation)은 오일러 각의 짐벌 락과 보간(interpolation) 제약을 어느정도 해결했습니다. 이름에서도 알 수 있듯이 회전 변환을 회전축과 회전각을 이용해 표현하는 방법입니다.
회전축을 나타내는 단위 벡터 e와 회전각 θ가 있을 때, 회전 벡터 θ는 방향이 e, 크기가 θ인 벡터(θ = θe) 가 됩니다.
단일 벡터로 회전을 표현하기 떄문에 순서를 신경 쓸 필요가 없으며 짐벌 락에 빠질 위험도 적습니다.
하지만 연산량이 너무 방대해 회전이 중첩되는 경우 어러 트릭을 사용해야지 계산이 가능하다는 문제점이 있습니다.
[Quaternion]
쿼터니언(Quaternion)은 사원수라고 부릅니다.
3차원 그래픽에서 회전을 표현할 때, 행렬 대신 사용하는 수학적 개념으로 4개의 값으로 이루어진 복소수 체계입니다.
쿼터니언은 행렬에 비해서 연산 속도가 빠르고, 차지하는 메모리의 양도 적으며, 오류가 날 확률이 작다는 장점이 있습니다.
짐벌락 현상 또한 막을 수 있습니다. (물론 완벽하게 막지는 못합니다.)
'게임 수학' 카테고리의 다른 글
2차원 변환(2D) (0) | 2024.05.31 |
---|