DirectX11 - Fixed Angle(고정 각), Euler Angle(오일러 각), Quaternion(사원수) 정리
3D Rotation Matrix
회전 행렬은 회전 변환 관계를 나타내기 위한 행렬이다.
https://dlemrcnd.tistory.com/2?category=515796
이전 포스팅에서 회전 행렬에 대해서 올렸었다.
위 4X4 행렬을 표현하기 위해서는 16개의 원소가 필요하다.
축과 회전 각도를 활용하여 간략하게 사용하기 위해
Fixed Angle, Euler Angle, Quaternion을 사용한다.
이를 가지고 행렬로 변환시켜 최종적으로 월드 행렬을 만든다.
Fixed Angles Rotation (고정 각 회전)
회전을 표현하는 여러 방법 중 하나다.
고정된 축 (Roll, Pitch, Yaw)을 가지고 회전을 시킨다.
https://www.youtube.com/watch?v=9Nxx7UK1JRo
XYZ 순서대로 회전을 했지만 우변을 보면 순서가 바뀐 것(ZYX)을 볼 수 있다.
제일 먼저 실행할 회전의 회전행열을 제일 뒤쪽에 두고 앞에서 곱해주는 방식이다.
이를 Pre-Multiplication 규칙이라 하며 이것을 지키며 회전한다.
Euler Angles Rotation (오일러 각 회전)
고정축 회전과 다르게 Post-Multiplication 규칙을 지키며 회전한다.
회전의 기준이 되는 축이 따로 있지 않고, 이전에 회전한 축 기준으로 회전한다.
기준 축이 회전 후에 새롭게 형성된다.
Post-Multiplication 규칙 덕분에 순서대로 곱해진다. 그래서 훨씬 직관적이다.
X축 회전을 롤(roll), Y축 회전을 피치(pitch),
Z 축 회전을 요(Yaw)라고 표기하는 X-Y-Z 좌표인 요, 피치, 롤 방식이 있다.
계속 생성되는 새로운 축, 각 축을 독립적으로 평가하기 때문에,
행렬을 서로 곱하면서 짐벌락이 나타나게 된다.
짐벌락 : 두 축이 겹쳐서 나머지 한축의 자유도가 상실함
xyz, xzy, yzx, yxz.. 어떤 순서대로 하든 짐벌락은 존재한다.
세 축이 동시에 업데이트되면 짐벌락을 해소할 수 있다.
사원수(쿼터니언 Quaternion)이 이를 해결한다.
사원수(쿼터니언 Quaternion)
19세기 윌리암 해밀턴에 의해서 만들어 짐
실수 4개를 갖아 행렬에 비해 저장공간 및 연산이 적고 보간을 할 때
좀 더 매끄러운 애니메이션이 가능하다.
세 축이 동시에 업데이트되면서 짐벌락을 해소할 수 있다.
회전 표현을 실수 4개, (실수부 1개 + 허수부 3개)로 표현한다.
실수(Real Number)와 허수(Imaginary Number) 성분을 갖는 걸
복소수(Complex Number)라고 한다.
사원수의 연산은 결합 법칙, 분배 법칙이 성립하지만 교환 법칙은 성립 안됨.
임의의 정점 v를 사원 수로 회전하기 위해서는 공액 켤레 곱셈(Conjugate Product)
을 사용해야 한다. 사원수는 정점과 바로 곱하지 못해서 정점 v를 사원수화(p)를 해야 함
단위 사원수와 공액 사원수를 앞뒤로 곱해 서서 결과를 얻을 수 있다.
임의의 점 v(1,1,1) 60도 회전 공식 적용 예시
셰이더는 역행렬이나 사원수를 지원하지 않는다. 레지스터가 제한적이기 때문이다.
그래서 사원수 -> 행렬, 행렬 -> 사원수로 변환하는 법을 알아야한다.
사원수 행렬의 변환은 행렬에 대한 정점의 곱으로 변환하면 된다.
아래는 유도된 사원수-> 행렬 변환 공식이다.