노력과 삽질 퇴적물

DX: 벡터와 행렬 본문

프로그래밍note/DX&OpenGL

DX: 벡터와 행렬

MTG 2012. 1. 10. 14:26






1. 벡터
1) 벡터와 좌표계.
-> DirectX는 기본적으로 왼손 좌표계(Left-handed)로 엄지(z) = 화면속으로 / 검지(x)는 가로 / 중지(y)는 세로.

 벡터(Vector)

 스칼라

공간상, 길이와 방향
크기와 방향을 모두 나타냄.(방향 표식 용이)
위치고려X
단위벡터 : 벡터의 길이, 크기가 1인 벡터

 


typedef struct D3DVECTOR //3차원 벡터
{
    float x, y, z;
} D3DVECTOR, *LPD3DVECTOR;

typedef struct D3DXVECTOR3 : public D3DVECTOR
{
public:
    D3DXVECTOR3() {};
    ...
    ...  
} D3DXVECTOR3, *LPD3DXVECTOR3;



2) 벡터의 크기
|vector(x, y)| = (x2 + y2)^1/2
-> 선분의 길이.

 예시 코드. 벡터의 크기

FLOAT D3DXVec3Length
(
  CONST D3DXVECTOR3 * pV
);

D3DXVECTOR3 v(0,3,4);
float len = D3DXVec3Length( &v);




3) 벡터의 정규화
-> 벡터의 크기를 1로 만들어 단위벡터로 만드는것.

vector(x, y, z)
-> (x/vec_leng, y/vec_leng, z/vec_leng) = 정규화

 예시 코드. 벡터의 정규화

D3DXVECTOR3 * D3DXVec3Normalize
(
  D3DXVECTOR3 * pOut,
  CONST D3DXVECTOR3 * pV
);
D3DXVec3Normalize( &n, &v );




4) 벡터의 사칙연산

 ①벡터의 덧셈

 ②벡터의 뺄셈

 ③벡터의 곱셈&나눗셈


Va(x1, y1, z1) + Vb(x2, y2, z2)
= (x1+x2, y1+y2, z1+z2) 


Va(x1, y1, z1) - Vb(x2, y2, z2)
= (x1-x2, y1-y2, z1-z2) 

Va(x1, y1, z1) * N
=  (x1* N, y1* N, z1* N)
{N ≤ 0 or N ≥ 0,
 0 ≤ |N| ≤ 1} 




5) 벡터의 내적(Dot Product)

 공식

예시코드. 내적

u = (x1, y1, z1)
v = (x2, y2, z2)

u · v
= (x1*x2, y1*y2, z1*z2)

FLOAT D3DXVec3Dot
(
  CONST D3DXVECTOR3 * pV1,
  CONST D3DXVECTOR3 * pV2
);

D3DXVECTOR3 u(1,2,1);
D3DXVECTOR3 v(1,1,1);
float result = D3DXVec3Dot( &u, &v);




6) 벡터의 외적(Vector Cross)
-> 두 벡터가 있을때 두 벡터에 수직인 벡터를 구함.

 공식

예시코드. 외적

u = (x1, y1, z1)
v = (x2, y2, z2)

 u X v
= (y1*z2 - z1*y2,
   z1*x2 - x1*z2,
   x1*y2 - x2*y1)
 

* 계산에 대한 요령이라면,
 각 축당, 해당 축을 제외한 원소들로
2차원 역행렬처럼 계산하면됨. 

D3DXVECTOR3 * D3DXVec3Cross

(
  D3DXVECTOR3 * pOut,
  CONST D3DXVECTOR3 * pV1,
  CONST D3DXVECTOR3 * pV2
);

D3DXVECTOR3 u(1,2,1);
D3DXVECTOR3 v(1,1,1);
D3DXVECTOR3 result = D3DXVec3Cross( & result, &u, &v);





2. 행렬
1) 행과 열
행: 가로로 나열된 줄.
열: 세로로 나열된 줄.
-> 게임프로그래밍등에서 행렬을 사용하는 이유는 행렬의 곱셈이 그만큼 유용해서.

 예시코드. 행렬.

typedef struct _D3DMATRIX
{
    union {
        struct {
            float        _11, _12, _13, _14;
            float        _21, _22, _23, _24;
            float        _31, _32, _33, _34;
            float        _41, _42, _43, _44;
        };
        float m[4][4];
    };
} D3DMATRIX;

typedef struct D3DXMATRIX : public D3DMATRIX
{
public:
    D3DXMATRIX() {};
......
......  
} D3DXMATRIX, *LPD3DXMATRIX;




2) 항등행렬
EA = AE = E 
-> 임의의 행렬에 곱해도 그 자신의 행렬이 되게 하는 행렬
-> 대표적인 항등행렬은

1

0

0

2

이나

1

0

0

0

0

0

1

0

0

0

0

0

1

0

0

0

0

0

1

0

0

0

0

0

1


 예시코드. 항등 행렬.

BOOL D3DXMatrixIsIdentity
(
  CONST D3DXMATRIX * pM
);

D3DXMATRIX I; 
D3DXMatrixIsIdentity(&I);




3) 행렬의 곱셈
-> 원하는 공간상에 점 벡터를 행렬과 연산키 위해서는 4차원 행렬을 사용.
-> (X, Y, Z, W)을 보통은 ( X, Y, Z, 1)로도 표시.
① 이동 행렬

 공식

 예시 코드.

D3DXMATRIX * D3DXMATRIXTranslation
(
  D3DXMATRIX * pOut,
  FLOAT x,
  FLOAT y,
  FLOAT z
);


② 스케일 행렬

 공식

 예시 코드.

D3DXMATRIX * D3DXMATRIXScaling
(
  D3DXMATRIX * pOut,
  FLOAT sx,
  FLOAT sy,
  FLOAT sz
);


③ 회전행렬

D3DXMATRIX * D3DXMatrixRotationX
(
  D3DXMATRIX * pOut,
  FLOAT Angle
);


④ 행렬의 조합
 곱셈의 연산의 다수일때, 과부하가 되므로 행렬로 묶어서 다수의 연산을 하나로 줄이게 됨. 이렇게 되면, 각 항목에 적용되는 곱셉과 덧셈의 숫자를 효과적으로 절감.

 



참고자료.
DirectX2(2012.01.01 ~2012.01.31)

'프로그래밍note > DX&OpenGL' 카테고리의 다른 글

OpenGL ES: 기초 및 입문 (2)  (0) 2016.11.24
OpenGL ES: 기초 및 입문 (1)  (0) 2016.08.04
OpenGL: 강좌 및 튜토리얼 모음  (2) 2011.12.10
DX: 기초이론(3)  (1) 2011.10.23
DX: 기초이론(2)  (0) 2011.10.18