|
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
이를 행렬로 나타내면 가 되므로 크기 행렬은 가 된다.
|
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 |
유튜브 동영상 강의 주소
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
이를 행렬로 나타내면 가 되므로 크기 행렬은 가 된다.
|
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 |