Upload
-
View
341
Download
5
Embed Size (px)
Citation preview
Geometric Transform(기하 변환)
Scaling transform(크기 변환)
Rotation transform(회전 변환)
Translation Transform(이동 변환)
D3D와 왼손 좌표계
D3D는 왼손 좌표계를 사용하기 때문에 (행 벡터) * (행렬)로 transfor을 수행한다.
OpenGL은 오른손 좌표계를 사용하기 때문에 (행렬) * (열 벡터)로 transform을 수행한다.
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)
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이 되도록 만든다.
4차원 동차좌표 활용한 geometric transform
이것을 3차원 좌표 (x’, y’, z’)로 하면 scaling,
rotation, translation에 대해서 하나의 행렬로
대치가 가능하다.
Translation Transform
translation transform은 vertex의 평행 이동
을 의미한다.
vertex의 평행 이동은 vertex의 위치를 상대적
으로 이동하는 것이다.
Scaling Transform
Scaling Transform은 vertex의 위치에 scalar
배를 적용한 것이다.
Translation Transform과 마찬가지로 4x4 변
환 행렬로 구성할 수 있다.
Rotation Transform matrix의 역행렬
각도를 –각도로 적용해주면 된다.
모든 회전 행렬은 직교 행렬이므로 역행렬과 전치행렬이 동일하다.
연산 속도는 – 각도를 적용하는 것보다는 전치시키는 것이 더 빠르다.
D3D Rotation Transform
D3D는 x, z축을 평면으로, y축을 하늘 방향으
로 지시하는 형태이다.
D3D Rotation Transform은 y축, x축, z축 순
서로 회전한다.
y축 회전은 Yaw
x축 회전은 Pitch
z축 회전은 Roll
Gimbal Lock
Euler Angle는 적용하기는 쉽지만 모든 오브젝트가 이 방법대로 움직이지 않는다는 문제가 발생한
다.
Gimbal Lock은 회전에서 그 곱의 순서를 알고 있지 않다면 전혀 다른 행렬을 만들어 다른 위치로
이동할 수 있다는 것이다.
Gimbal Lock을 해결하기 위해서는 회전 각도를 누적시키는 것이 아니라 임의의 축에 대해서 회전
행렬을 만들고 이 회전 행렬을 계속 곱해야만 해결이 된다.
DXD 임의의 축에 대한 회전 행렬 함수
D3DXMATRIX* WINAPI D3DXMatrixRotationAxis
( D3DMATRIX * pOut, CONST D3DXVECTOR3 *pV, FLOAT Angle );
QUATERNION
사원수
복소수 표현을 확장하기 위해서 만들어졌다.
벡터 해석보다 사용이 난해하여 잘 사용되지 않다가 3D 프로그램에서 회전에 자주 사용된다.
벡터를 활용하여 임의의 축에 대한 회전을 구할 수가 있지만, QUATERNION을 사용하면 벡터로 구
한 결과보다 간결하고, C++의 Overloading을 적용하면 프로그램을 구현하기가 쉬워진다.
복소수와 QUATERNION
Real Number + Imaginary Number
2 + 3i
a + bi
Real Number + 3개의 Imaginary Number
단위벡터 v는 회전 축
단위벡터 I, j, k는 좌표 축의 단위 벡터