5. Geometric Transform을 한 번에
Geometry Transform을 Scalling, Rotation, Translation 과정을 각각 거치지 않고 단 하나의 행렬
로 처리할 수 있다.
하나의 행렬로 처리하기 위해서는 3차원 벡터를 4차원 동차 좌표(Homo generous Coordinate)로
바꾸어야 한다.
4차원 동차 좌표의 예시: (1, 2, 3, 4), (2, 4, 6, 8), (0.5, 1, 1.5 ,2)
6. 4차원 동차 좌표
4차원에서 두 개의 좌표가 동차 좌표가 되려면 ‘벡터 a = k * 벡터 b’ 관계가 성립되면 된다.
이 관계를 이용해서 3차원 좌표 (x, y, z)는 4차원 동차 좌표에서 무수히 많은 좌표를 가질 수 있다.
이들 중에서 특별히 마지막 w 값이 1인 동차 좌표를 사용한다.
3차원 좌표 (x, y, z) -> 4차원 동차 좌표 (x, y, z, 1)
4차원 좌표 변환에 행렬을 이용할 경우 4x4 행렬이 필요하고, 변환한 후에 w값으로 x, y, z, w를 나누
어서 항상 w = 1이 되도록 만든다.
33. Gimbal Lock
Euler Angle는 적용하기는 쉽지만 모든 오브젝트가 이 방법대로 움직이지 않는다는 문제가 발생한
다.
Gimbal Lock은 회전에서 그 곱의 순서를 알고 있지 않다면 전혀 다른 행렬을 만들어 다른 위치로
이동할 수 있다는 것이다.
Gimbal Lock을 해결하기 위해서는 회전 각도를 누적시키는 것이 아니라 임의의 축에 대해서 회전
행렬을 만들고 이 회전 행렬을 계속 곱해야만 해결이 된다.
34. 임의의 축에 대한 회전
임의의 점 벡터 P가 단위 벡터 n에 대해서 회전한 점 벡터
36. DXD 임의의 축에 대한 회전 행렬 함수
D3DXMATRIX* WINAPI D3DXMatrixRotationAxis
( D3DMATRIX * pOut, CONST D3DXVECTOR3 *pV, FLOAT Angle );
37. QUATERNION
사원수
복소수 표현을 확장하기 위해서 만들어졌다.
벡터 해석보다 사용이 난해하여 잘 사용되지 않다가 3D 프로그램에서 회전에 자주 사용된다.
벡터를 활용하여 임의의 축에 대한 회전을 구할 수가 있지만, QUATERNION을 사용하면 벡터로 구
한 결과보다 간결하고, C++의 Overloading을 적용하면 프로그램을 구현하기가 쉬워진다.
38. 복소수와 QUATERNION
Real Number + Imaginary Number
2 + 3i
a + bi
Real Number + 3개의 Imaginary Number
단위벡터 v는 회전 축
단위벡터 I, j, k는 좌표 축의 단위 벡터