50
Transform NHN NEXT 장문익

3D Graphics Transform

  • Upload
    -

  • View
    341

  • Download
    5

Embed Size (px)

Citation preview

Transform

NHN NEXT 장문익

Geometric Transform(기하 변환)

Scaling transform(크기 변환)

Rotation transform(회전 변환)

Translation Transform(이동 변환)

D3D와 왼손 좌표계

D3D는 왼손 좌표계를 사용하기 때문에 (행 벡터) * (행렬)로 transfor을 수행한다.

OpenGL은 오른손 좌표계를 사용하기 때문에 (행렬) * (열 벡터)로 transform을 수행한다.

Geometic Transfrom의 예

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

4차원 동차좌표 활용한 geometric transform

이것을 3차원 좌표 (x’, y’, z’)로 하면 scaling,

rotation, translation에 대해서 하나의 행렬로

대치가 가능하다.

Translation Transform

translation transform은 vertex의 평행 이동

을 의미한다.

vertex의 평행 이동은 vertex의 위치를 상대적

으로 이동하는 것이다.

Translation Transform 수식 표현

벡터 T에 대한 Translation Transform matrix

Translation Transform matrix의 역행렬

벡터 T의 반대 방향으로 변환하는 행렬

D3D Translation Transform 함수

Scaling Transform

Scaling Transform은 vertex의 위치에 scalar

배를 적용한 것이다.

Translation Transform과 마찬가지로 4x4 변

환 행렬로 구성할 수 있다.

Scaling Transform 수식 표현

벡터 S에 대한 Scaling Translation matrix

Scaling Translation matrix의 역행렬

D3D Scaling Transform 함수

Rotation Transform

Euler Angle을 이용한 방법

임의의 축에 대한 회전(임의의 축에 대한 최전은 Quaternion(사원수)로 풀 수 있다.

2차원에서 정점의 회전

2차원에서의 정점 이동 수식 표현

2차원에서 정점의 회전 이동 행렬

D3D에서 사용할 수 있는 회전 행렬로 바꾸기

(벡터) * (행렬) 형태로 바꿔야 한다.

바꾸는 방법은 전치 행렬

3차원에서 Rotation Transform matrix(x축)

3차원에서 Rotation Transform matrix(y축)

3차원에서 Rotation Transform matrix(z축)

Rotation Transform matrix의 역행렬

각도를 –각도로 적용해주면 된다.

모든 회전 행렬은 직교 행렬이므로 역행렬과 전치행렬이 동일하다.

연산 속도는 – 각도를 적용하는 것보다는 전치시키는 것이 더 빠르다.

D3D Rotation Transform 함수

D3DXMatrixRotationX()

D3DXMatrixRotationY()

D3DXMatrixRotationZ()

Euler Angle

각 축에 대한 행렬을 연속으로 곱해서 최종 회전 행렬을 만들 때 그 각도를 말한다.

D3D Rotation Transform

D3D는 x, z축을 평면으로, y축을 하늘 방향으

로 지시하는 형태이다.

D3D Rotation Transform은 y축, x축, z축 순

서로 회전한다.

y축 회전은 Yaw

x축 회전은 Pitch

z축 회전은 Roll

Euler Angle로 구한 Rotation Transform matrix

D3D Euler Angle에 대한 Rotation Transform 함수

Gimbal Lock

Euler Angle는 적용하기는 쉽지만 모든 오브젝트가 이 방법대로 움직이지 않는다는 문제가 발생한

다.

Gimbal Lock은 회전에서 그 곱의 순서를 알고 있지 않다면 전혀 다른 행렬을 만들어 다른 위치로

이동할 수 있다는 것이다.

Gimbal Lock을 해결하기 위해서는 회전 각도를 누적시키는 것이 아니라 임의의 축에 대해서 회전

행렬을 만들고 이 회전 행렬을 계속 곱해야만 해결이 된다.

임의의 축에 대한 회전

임의의 점 벡터 P가 단위 벡터 n에 대해서 회전한 점 벡터

임의의 축에 대한 회전

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는 좌표 축의 단위 벡터

Quarternian의 좌표 축 단위벡터 성질 정의

QUATERNION Conjuagate

복소수처럼 켤레복소수가 있다.

QUATERNION의 크기

Quaternion 곱셈

Quaternion 연산 법칙

QUATERNION과 Translation

임의의 축에 대한 회전과 QUATERNION의 곱

QUATERNION을 이용한 회전1

임의의 축(Axis)과 각도를 QUATERNION으로 바꾼다. 이 때 각도는 ‘1/2’로 한다.

QUATERNION을 이용한 회전2

회전을 적용할 정점을 QUATERNION으로 바꾼다.

QUATERNION을 이용한 회전3

QUATERNION 곱 q*P*q-1 연산을 수행한다.(D3D는 왼손 좌표계이기 때문에 q-1*P*q 순으로 곱한

다.)

QUATERNION을 이용한 회전4

최종 연산의 결과도 QUATERNION이므로 이중에서 허수 부를 선택한다.

참고자료

http://3dapi.com/