관리 메뉴

드럼치는 프로그래머

[DirectX] 벡터 / 벡터의 연산 본문

★─Programing/☆─DirectX

[DirectX] 벡터 / 벡터의 연산

드럼치는한동이 2010. 2. 17. 14:01

벡터표현

D3DX는 3차원 벡터 표현을 위해서 C++ 구조체 타입인 D3DXVECTOR3을 제공한다.

2차원 벡터 표현을 위해서 D3DXVECTOR2가 제공되며

4차원 벡터 표현을 위해서 D3DXVECTOR4가 제공된다.

 

2차원 벡터표현에서는 필드로 x, y를 가지며, 4차원 표현에서는 x, y, z, w를 필드로 가진다.

모든 연산자 정의는 동일하다.

 

겹지정 연산자를 통한 벡터 연산

벡터연산은 겹지정된 연산자를 통해서 연산이 가능하다.

벡터의 덧셈은 벡터의 각 요소별 덧셈으로 정의된다.

 

D3DXVECTOR3 u(1.0f, 0.0f, 2.0f);

D3DXVECTOR3 v(0.0f, -1.0f, 3.0f);

D3DXVECTOR3 sum = u + v;

첫번째 벡터는 (1, 0, 2)이고 두번째 벡터가 (0, -1, 3)이므로 변수 sum은 (1, -1, 5)의 값을 가진다.

 

D3DXVECTOR3 u(1.0f, 0.0f, 2.0f);

D3DXVECTOR3 v(0.0f, -1.0f, 3.0f);

D3DXVECTOR3 diff = u - v;

벡터의 뺄셈도 벡터의 각 요소별 뺄셈으로 정의된다.

위의 연산결과인 diff는 (1, 1, -1)의 값을 가진다.

 

D3DXVECTOR3 u(1.0f, 2.0f, -1.0f);

D3DXVECTOR3 scaled = u * 2.0f;

벡터와 스칼라의 곱셈은 스칼라 값을 벡터의 각 요소별 곱셈으로 정의된다.

위의 연산 결과 scaled는 (2, 4, -2)의 값을 가지게 된다.

 

벡터 연산 함수를 통한 벡터 연산

D3DX는 다양한 벡터 연산을 위해서 벡터 연산 함수들을 제공한다.

3차원 벡터에 대해서 D3DXVec3로 시작하는 많은 함수들을 제공한다.

2/4차원 벡터에 대해서는 각각 D3DXVec2로 시작하거나 D3DxVec4로 시작하는 함수를 제공한다.

 

D3DXVec3Length : 벡터의 길이(length)를 계산한다.

벡터의 길이는 벡터의 놈(norm)또는 크기(magnitude)와 같은 의미로,

벡터 (x, y, z)의 크기는 d = root x^2 + y^2 + z^2 이다.

 

D3DXVECTOR v(1.0f, 2.0f, 3.0f);

float magnitude = D3DXVec3Length( &v );

- 이 코드에서 벡터의 크기 magnitude는 root 14의 값을 가진다. ( root 1 + 4 + 9 )

 

D3DXVec3Normalize : 벡터를 정규화(normalization)한다.

정규화는 벡터의 크기(magnitude)가 1이 되도록 하는 과정이다.

따라서 벡터 (x, y, z)의 정규화된 벡터는 (x/d, y/d, z/d)가 된다.

 

D3DXVECTOR3 u(3.0f, 0.0f, 1.0f);

D3DXVEVTOR3 n;

D3DXVec3Normalize(&n, &u);

- 이 코드에서 n은 root 10으로 각 요소를 나눈 값이므로 대략 (0.95, 0.00, 0.32)의 값이 된다.

 

D3DXVec3Dot : 벡터의 내적(inner product)을 계산한다.

 

D3DXVECTOR3 u(1.0f, -1.0f, 2.0f);

D3DXVECTOR3 v(2.0f, 0.0f, 1.0f);

float dot = D3DXVec3Dot ( &u, &v );

- 이 코드에서 u는 (1, -1, 2)이고 v는 (2, 0, 1)이므로 내적 dot는 1*2 + (-1)*0 + 2*1이므로 4가 된다.

 

D3DXVec3Cross : 벡터의 외적(outer product)을 계산한다.

두 벡터의 외적은 두 벡터에 수직인 벡터로 노말벡터(normal vector)라고 한다.

두 벡터 u와 v의 외적 u x v를 w라고 하면

w = ( w(x), w(y), w(z) )는 아래와 같다.

  w(x) = u(y)v(z) - u(z)v(y), w(y) = u(x)v(z) - u(z)v(x), w(z) = u(x)v(y) - u(y)v(x)

u와 v의 순서를 바꾸어 외적을 구한다면 벡터의 부호가 바뀌게 된다. 즉 u x v = -( v x u ) 이다.

 

D3DXVECTOR3 u(1.0f, 0.0f, 0.0f);

D3DXVECTOR3 v(0.0f, 1.0f, 0.0f);

D3DXVECTOR3 cross;

D3DXVec3Cross (&cross, &u, &v);

- 이 코드에서 u는 (1, 0, 0)이고 v는 (0, 1, 0)이므로 외적은 (0, 0, 1)이 된다.

  u와 v의 순서를 바꾸면 외적은 (0, 0, -1)이 된다.

 

출처 : DirectX 10을 통한 3차원 게임 프로그래밍(박종승 저 - 도서출판 그린)


Comments