노력과 삽질 퇴적물
DX: 벡터와 행렬 본문
1. 벡터
1) 벡터와 좌표계.-> DirectX는 기본적으로 왼손 좌표계(Left-handed)로 엄지(z) = 화면속으로 / 검지(x)는 가로 / 중지(y)는 세로.
벡터(Vector) |
스칼라 |
공간상, 길이와 방향 |
|
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
-> 선분의 길이.
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) = 정규화
-> 벡터의 크기를 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) |
FLOAT D3DXVec3Dot |
6) 벡터의 외적(Vector Cross)
-> 두 벡터가 있을때 두 벡터에 수직인 벡터를 구함.
공식 |
예시코드. 외적 |
u = (x1, y1, z1) |
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);
|
-> 원하는 공간상에 점 벡터를 행렬과 연산키 위해서는 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
);
|
④ 행렬의 조합
곱셈의 연산의 다수일때, 과부하가 되므로 행렬로 묶어서 다수의 연산을 하나로 줄이게 됨. 이렇게 되면, 각 항목에 적용되는 곱셉과 덧셈의 숫자를 효과적으로 절감.
참고자료.
'📂기초 및 세팅 note > 2D & 3D' 카테고리의 다른 글
파이썬: 게임엔진 (0) | 2015.03.14 |
---|---|
플래시: 스탈링(Starling) 엔진 (0) | 2013.11.15 |
OpenGL: 강좌 및 튜토리얼 모음 (2) | 2011.12.10 |
DX: 기초이론(3) (1) | 2011.10.23 |
DX: 기초이론(2) (0) | 2011.10.18 |