CAFE

3D 게임 프로그래밍

5강. 행렬 변환

작성자나우프로|작성시간16.07.01|조회수1,840 목록 댓글 0

부글부글유튜브 동영상 강의 주소

    (1) https://youtu.be/7MVNKxIV3pI
    (2) https://youtu.be/gCuOJ_vuSfY

소스는 자료실에 있습니다.!!

 

5.1 이동 행렬(Translation Matrix)


1) 역할

 

( x, y, z )를 ( Tx, Ty, Tz ) 만큼 이동시킨 정점 ( x', y', z' )를 식으로 나타내면 아래와 같다.

 

x' = x + Tx

y' = y + Ty

z' = z + Tz


이를 행렬로 표현 하면 [ x, y, z, 1 ] * = [ x + Tx, y + Ty,  z + Tz, 1 ] 가되므로 이동행렬은

 

 가 된다.


2) 이동 행렬 함수

 

D3DXMATRIX * D3DXMatrixTranslation(

  __inout  D3DXMATRIX *pOut,

  __in     FLOAT x,

  __in     FLOAT y,

  __in     FLOAT z

);


5.2 크기 행렬(Scale Matrix)


1) 개념

 

정점 ( x, y, z )를 x, y, z축으로 Sx, Sy, Sz 만큼 스케일링(확대/축소)한 정점

( x', y', z' )을 연립방정식 형태로 나타내면 아래와 같다.


x' = x × Sx

y' = y × Sy

z' = z × Sz


이를 행렬로 나타내면   가 되므로 크기 행렬은 가 된다.

 

확대축소 값인 Sx, Sy, Sz에 0을 대입하면 벡터 성분의 값이 0이 되므로 확대축소가 안됨


2) 크기 행렬 함수

 

D3DXMATRIX * D3DXMatrixScaling(

  __inout  D3DXMATRIX *pOut,

  __in     FLOAT sx,

  __in     FLOAT sy,

  __in     FLOAT sz

);


5.3 x, y, z축을 중심으로 한 회전 행렬(rotation matrix)


1) 회전 방향

 

아래와 같이 각 축을 왼손으로 감싼 방향으로 회전한다.


[그림 5-1] 왼손 좌표계의 회전 방향


2) 라디안과 호도값의 변환 매크로 함수

 

D3DXToDegree( radian )

 라디안을 호도값으로 변환

D3DXToRadian( degree )

 호도값을 라디안으로 변환

 

※ 포함 헤더는 d3dx9math.h 이다.


3) x 축 회전 행렬과 함수

 

 

D3DXMATRIX * D3DXMatrixRotationX(

  __inout  D3DXMATRIX *pOut,

  __in     FLOAT Angle    // 라디안 값

);


4) y 축 회전 행렬과 함수

 

 

D3DXMATRIX * D3DXMatrixRotationY(

  __inout  D3DXMATRIX *pOut,

  __in     FLOAT Angle     // 라디안 값

);


5) z 축 회전 행렬과 함수


 D3DXMATRIX * D3DXMatrixRotationZ(

  __inout  D3DXMATRIX *pOut,

  __in     FLOAT Angle     // 라디안 값

);


6) x, y, z축의 회전이 적용된 행렬을 구해주는 함수  

 

회전의 순서는 첫 번째 roll이 먼저 일어나며 pitch 그리고 yaw의 순서로 회전이 적용된 행렬이 구해진다.

 

D3DXMATRIX * D3DXMatrixRotationYawPitchRoll(

  __inout  D3DXMATRIX *pOut,

  __in     FLOAT Yaw,

  __in     FLOAT Pitch,

  __in     FLOAT Roll

);

[그림 5-2] yaw(y), pitch(x), roll(z)의 회전 방향


5.4 임의의 축을 중심으로 한 회전 행렬 함수


D3DXMATRIX * D3DXMatrixRotationAxis(

  __inout  D3DXMATRIX *pOut,

  __in     const D3DXVECTOR3 *pV,

  __in     FLOAT Angle

);

 

※ 회전 방향은 시계반향이다.


[그림 5-3] 축 회전 방향


5.5 이동과 회전 그리고 확대 및 축소 행렬의 결합 순서

 

축을 중심으로 회전한 행렬에 이동 행렬을 곱해야만 회전된 행렬을 구할 수 있다.

만약 이동한 행렬에 회전 행렬을 곱하여 적용하면 이동된 위치에서 회전이 일어나게 된다.

그래서 변환 행렬의 곱은 아래와 같다.


( 크기 행렬 × 회전 행렬(z→x→y) × 이동 행렬)


5.6 쿼터니온(사원수, quaternion)


 

1) 개념

 

임의의 축을 기준으로 회전 행렬을 구해 주는 것으로 일반 회전 행렬에 비해 계산량이 적고 메모리를 적게 차지하는

장점이 있다.

쿼터니온에서 x, y, z는 회전축 벡터이며 w는 회전값(라디안)을 나타낸다.

또한 w의 회전 방향은 반시계(CCW)이다.


2) 쿼터니온 데이터 구조

 

typedef struct D3DXQUATERNION {

  FLOAT x;

  FLOAT y;

  FLOAT z;

  FLOAT w;

} D3DXQUATERNION, *LPD3DXQUATERNION;

 

typedef struct D3DXQUATERNION

{

#ifdef __cplusplus

public:

    D3DXQUATERNION() {}

    D3DXQUATERNION( CONST FLOAT * );

    D3DXQUATERNION( CONST D3DXFLOAT16 * );

    D3DXQUATERNION( FLOAT x, FLOAT y, FLOAT z, FLOAT w );

 

    // casting

    operator FLOAT* ();

    operator CONST FLOAT* () const;

 

    // assignment operators

    D3DXQUATERNION& operator += ( CONST D3DXQUATERNION& );

    D3DXQUATERNION& operator -= ( CONST D3DXQUATERNION& );

    D3DXQUATERNION& operator *= ( CONST D3DXQUATERNION& );

    D3DXQUATERNION& operator *= ( FLOAT );

    D3DXQUATERNION& operator /= ( FLOAT );

 

    // unary operators

    D3DXQUATERNION  operator + () const;

    D3DXQUATERNION  operator - () const;

 

    // binary operators

    D3DXQUATERNION operator + ( CONST D3DXQUATERNION& ) const;

    D3DXQUATERNION operator - ( CONST D3DXQUATERNION& ) const;

    D3DXQUATERNION operator * ( CONST D3DXQUATERNION& ) const;

    D3DXQUATERNION operator * ( FLOAT ) const;

    D3DXQUATERNION operator / ( FLOAT ) const;

 

    friend D3DXQUATERNION operator * (FLOAT, CONST D3DXQUATERNION& );

 

    BOOL operator == ( CONST D3DXQUATERNION& ) const;

    BOOL operator != ( CONST D3DXQUATERNION& ) const;

 

#endif //__cplusplus

    FLOAT x, y, z, w;

} D3DXQUATERNION, *LPD3DXQUATERNION;


3) 쿼터니온 연산

 

쿼터니온 연산에는 기본적으로 덧셈, 뺄셈, 스칼라 곱, 쿼터니온 간의 곱셈이 있으며 쿼터니온 곱

회전을 먼저 적용하고 회전을 적용한 쿼터니온 Q 가 구해진다.

일반적인 곱의 반대 순서로 연산되며 교환 법칙은 적용되지 않는다.


4) 쿼터니온 함수들


① 회전 행렬을 쿼터니온으로 만드는 함수

 

 D3DXQUATERNION * D3DXQuaternionRotationMatrix(

  __inout  D3DXQUATERNION *pOut,

  __in     const D3DXMATRIX *pM

);


② yaw, pitch, roll에 의한 쿼터니온을 만드는 함수

 

D3DXQUATERNION * D3DXQuaternionRotationYawPitchRoll(

  __inout  D3DXQUATERNION *pOut,

  __in     FLOAT Yaw,

  __in     FLOAT Pitch,

  __in     FLOAT Roll

);


③ 임의의 축에 대해서 회전한 쿼터니온을 구하는 함수

 

D3DXQUATERNION * D3DXQuaternionRotationAxis(

  __inout  D3DXQUATERNION *pOut,

  __in     const D3DXVECTOR3 *pV,

  __in     FLOAT Angle

);

※ 회전방향은 시계방향(CW)이다.


④ 쿼터니온으로부터 회전 행렬을 구하는 함수

 

D3DXMATRIX * D3DXMatrixRotationQuaternion(

  __inout  D3DXMATRIX *pOut,

  __in     const D3DXQUATERNION *pQ

);


⑤ 길이가 1인 쿼터니온을 구하는 함수

 

 D3DXQUATERNION * D3DXQuaternionNormalize(

  __inout  D3DXQUATERNION *pOut,

  __in     const D3DXQUATERNION *pQ

);


⑥ 기타 함수들

 

D3DXQuaternionBaryCentric 

D3DXQuaternionConjugate 

D3DXQuaternionDot 

D3DXQuaternionExp 

D3DXQuaternionIdentity 

D3DXQuaternionInverse 

D3DXQuaternionIsIdentity 

D3DXQuaternionLength 

D3DXQuaternionLengthSq 

D3DXQuaternionLn 

D3DXQuaternionMultiply 

D3DXQuaternionNormalize 

D3DXQuaternionRotationAxis 

D3DXQuaternionRotationMatrix 

D3DXQuaternionRotationYawPitchRoll 

D3DXQuaternionSlerp 

D3DXQuaternionSquad 

D3DXQuaternionToAxisAngle 

 

 

유튜브 동영상 강의 주소

    (1) http://youtu.be/8XcyU4C5D4Q
    (2) http://youtu.be/8s30ag9hWWY

다운로드d3d-5.zip

 

5.1 이동 행렬(Translation Matrix)


1) 역할

 

( x, y, z )를 ( Tx, Ty, Tz ) 만큼 이동시킨 정점 ( x', y', z' )를 식으로 나타내면 아래와 같다.

 

x' = x + Tx

y' = y + Ty

z' = z + Tz


이를 행렬로 표현 하면 [ x, y, z, 1 ] * = [ x + Tx, y + Ty,  z + Tz, 1 ] 가되므로 이동행렬은

 

 가 된다.


2) 이동 행렬 함수

 

D3DXMATRIX * D3DXMatrixTranslation(

  __inout  D3DXMATRIX *pOut,

  __in     FLOAT x,

  __in     FLOAT y,

  __in     FLOAT z

);


5.2 크기 행렬(Scale Matrix)


1) 개념

 

정점 ( x, y, z )를 x, y, z축으로 Sx, Sy, Sz 만큼 스케일링(확대/축소)한 정점

( x', y', z' )을 연립방정식 형태로 나타내면 아래와 같다.


x' = x × Sx

y' = y × Sy

z' = z × Sz


이를 행렬로 나타내면   가 되므로 크기 행렬은 가 된다.

 

확대축소 값인 Sx, Sy, Sz에 0을 대입하면 벡터 성분의 값이 0이 되므로 확대축소가 안됨


2) 크기 행렬 함수

 

D3DXMATRIX * D3DXMatrixScaling(

  __inout  D3DXMATRIX *pOut,

  __in     FLOAT sx,

  __in     FLOAT sy,

  __in     FLOAT sz

);


5.3 x, y, z축을 중심으로 한 회전 행렬(rotation matrix)


1) 회전 방향

 

아래와 같이 각 축을 왼손으로 감싼 방향으로 회전한다.


[그림 5-1] 왼손 좌표계의 회전 방향


2) 라디안과 호도값의 변환 매크로 함수

 

D3DXToDegree( radian )

 라디안을 호도값으로 변환

D3DXToRadian( degree )

 호도값을 라디안으로 변환

 

※ 포함 헤더는 d3dx9math.h 이다.


3) x 축 회전 행렬과 함수

 

 

D3DXMATRIX * D3DXMatrixRotationX(

  __inout  D3DXMATRIX *pOut,

  __in     FLOAT Angle    // 라디안 값

);


4) y 축 회전 행렬과 함수

 

 

D3DXMATRIX * D3DXMatrixRotationY(

  __inout  D3DXMATRIX *pOut,

  __in     FLOAT Angle     // 라디안 값

);


5) z 축 회전 행렬과 함수


 D3DXMATRIX * D3DXMatrixRotationZ(

  __inout  D3DXMATRIX *pOut,

  __in     FLOAT Angle     // 라디안 값

);


6) x, y, z축의 회전이 적용된 행렬을 구해주는 함수  

 

회전의 순서는 첫 번째 roll이 먼저 일어나며 pitch 그리고 yaw의 순서로 회전이 적용된 행렬이 구해진다.

 

D3DXMATRIX * D3DXMatrixRotationYawPitchRoll(

  __inout  D3DXMATRIX *pOut,

  __in     FLOAT Yaw,

  __in     FLOAT Pitch,

  __in     FLOAT Roll

);

[그림 5-2] yaw(y), pitch(x), roll(z)의 회전 방향


5.4 임의의 축을 중심으로 한 회전 행렬 함수


D3DXMATRIX * D3DXMatrixRotationAxis(

  __inout  D3DXMATRIX *pOut,

  __in     const D3DXVECTOR3 *pV,

  __in     FLOAT Angle

);

 

※ 회전 방향은 시계반향이다.


[그림 5-3] 축 회전 방향


5.5 이동과 회전 그리고 확대 및 축소 행렬의 결합 순서

 

축을 중심으로 회전한 행렬에 이동 행렬을 곱해야만 회전된 행렬을 구할 수 있다.

만약 이동한 행렬에 회전 행렬을 곱하여 적용하면 이동된 위치에서 회전이 일어나게 된다.

그래서 변환 행렬의 곱은 아래와 같다.


( 크기 행렬 × 회전 행렬(z→x→y) × 이동 행렬)


5.6 쿼터니온(사원수, quaternion)


 

1) 개념

 

임의의 축을 기준으로 회전 행렬을 구해 주는 것으로 일반 회전 행렬에 비해 계산량이 적고 메모리를 적게 차지하는

장점이 있다.

쿼터니온에서 x, y, z는 회전축 벡터이며 w는 회전값(라디안)을 나타낸다.

또한 w의 회전 방향은 반시계(CCW)이다.


2) 쿼터니온 데이터 구조

 

typedef struct D3DXQUATERNION {

  FLOAT x;

  FLOAT y;

  FLOAT z;

  FLOAT w;

} D3DXQUATERNION, *LPD3DXQUATERNION;

 

typedef struct D3DXQUATERNION

{

#ifdef __cplusplus

public:

    D3DXQUATERNION() {}

    D3DXQUATERNION( CONST FLOAT * );

    D3DXQUATERNION( CONST D3DXFLOAT16 * );

    D3DXQUATERNION( FLOAT x, FLOAT y, FLOAT z, FLOAT w );

 

    // casting

    operator FLOAT* ();

    operator CONST FLOAT* () const;

 

    // assignment operators

    D3DXQUATERNION& operator += ( CONST D3DXQUATERNION& );

    D3DXQUATERNION& operator -= ( CONST D3DXQUATERNION& );

    D3DXQUATERNION& operator *= ( CONST D3DXQUATERNION& );

    D3DXQUATERNION& operator *= ( FLOAT );

    D3DXQUATERNION& operator /= ( FLOAT );

 

    // unary operators

    D3DXQUATERNION  operator + () const;

    D3DXQUATERNION  operator - () const;

 

    // binary operators

    D3DXQUATERNION operator + ( CONST D3DXQUATERNION& ) const;

    D3DXQUATERNION operator - ( CONST D3DXQUATERNION& ) const;

    D3DXQUATERNION operator * ( CONST D3DXQUATERNION& ) const;

    D3DXQUATERNION operator * ( FLOAT ) const;

    D3DXQUATERNION operator / ( FLOAT ) const;

 

    friend D3DXQUATERNION operator * (FLOAT, CONST D3DXQUATERNION& );

 

    BOOL operator == ( CONST D3DXQUATERNION& ) const;

    BOOL operator != ( CONST D3DXQUATERNION& ) const;

 

#endif //__cplusplus

    FLOAT x, y, z, w;

} D3DXQUATERNION, *LPD3DXQUATERNION;


3) 쿼터니온 연산

 

쿼터니온 연산에는 기본적으로 덧셈, 뺄셈, 스칼라 곱, 쿼터니온 간의 곱셈이 있으며 쿼터니온 곱

회전을 먼저 적용하고 회전을 적용한 쿼터니온 Q 가 구해진다.

일반적인 곱의 반대 순서로 연산되며 교환 법칙은 적용되지 않는다.


4) 쿼터니온 함수들


① 회전 행렬을 쿼터니온으로 만드는 함수

 

 D3DXQUATERNION * D3DXQuaternionRotationMatrix(

  __inout  D3DXQUATERNION *pOut,

  __in     const D3DXMATRIX *pM

);


② yaw, pitch, roll에 의한 쿼터니온을 만드는 함수

 

D3DXQUATERNION * D3DXQuaternionRotationYawPitchRoll(

  __inout  D3DXQUATERNION *pOut,

  __in     FLOAT Yaw,

  __in     FLOAT Pitch,

  __in     FLOAT Roll

);


③ 임의의 축에 대해서 회전한 쿼터니온을 구하는 함수

 

D3DXQUATERNION * D3DXQuaternionRotationAxis(

  __inout  D3DXQUATERNION *pOut,

  __in     const D3DXVECTOR3 *pV,

  __in     FLOAT Angle

);

※ 회전방향은 시계방향(CW)이다.


④ 쿼터니온으로부터 회전 행렬을 구하는 함수

 

D3DXMATRIX * D3DXMatrixRotationQuaternion(

  __inout  D3DXMATRIX *pOut,

  __in     const D3DXQUATERNION *pQ

);


⑤ 길이가 1인 쿼터니온을 구하는 함수

 

 D3DXQUATERNION * D3DXQuaternionNormalize(

  __inout  D3DXQUATERNION *pOut,

  __in     const D3DXQUATERNION *pQ

);


⑥ 기타 함수들

 

D3DXQuaternionBaryCentric 

D3DXQuaternionConjugate 

D3DXQuaternionDot 

D3DXQuaternionExp 

D3DXQuaternionIdentity 

D3DXQuaternionInverse 

D3DXQuaternionIsIdentity 

D3DXQuaternionLength 

D3DXQuaternionLengthSq 

D3DXQuaternionLn 

D3DXQuaternionMultiply 

D3DXQuaternionNormalize 

D3DXQuaternionRotationAxis 

D3DXQuaternionRotationMatrix 

D3DXQuaternionRotationYawPitchRoll 

D3DXQuaternionSlerp 

D3DXQuaternionSquad 

D3DXQuaternionToAxisAngle 

 

  좋은하루


다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼