Presentation is loading. Please wait.

Presentation is loading. Please wait.

DirectX9를 이용한 3D GAME 프로그래밍 입문

Similar presentations


Presentation on theme: "DirectX9를 이용한 3D GAME 프로그래밍 입문"— Presentation transcript:

1 DirectX9를 이용한 3D GAME 프로그래밍 입문
Frank D. Luna 저 최현호 역, 김성완 감수 정보문화사, 2004 강의노트: vmlab.suwon.ac.kr/mwlee 영상

2 DirectX 설치 DirectX 환경설정 설치: DirectX 2004 년 버전 압축해제는 C:\DXSDK 로,
INCLUDE 및 LIB 파일 추가 도구=>옵션=>Directories 에서 INCLUDE/LIB 를 다음으로 설정 C:\DXSDK\INCLUDE C:\DXSDK\LIB 2010-1학기 컴퓨터게임(DirectX)

3 예제 프로그램 사이트 2010-1학기 컴퓨터게임(DirectX)

4 DirectX 컴파일시 (Visual C++ 6.0)
여러 파일 추가시 project => Add-to-project => Files 에서 해당 파일들 추가 빌드시 링크해야 하는 것 project => Setting => Link 에서 d3d9.lib d3dx9.lib winmm.lib 추가 console => windows로 변경 2010-1학기 컴퓨터게임(DirectX)

5 오류 처리 (1) LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 오류 처리 Project => Setting => Link 에서 console => windows 로 바꿈 d3dx9.lib(fastftoa.obj) : error LNK2001: unresolved external symbol __aulldvrm Debug/camera.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. 오류 처리 d3d9.lib d3dx9d.lib winmm.lib 추가 (d3dx9 => d3dx9d 로 변경 링크) 2010-1학기 컴퓨터게임(DirectX)

6 오류처리 (2) Linking... d3dx9.lib(jidctflt.obj) : error LNK2001: unresolved external symbol __ftol2 d3dx9.lib(cshaderprogram.obj) : error LNK2001: unresolved external symbol __ftol2 d3dx9.lib(jcdctmgr.obj) : error LNK2001: unresolved external symbol __ftol2 d3dx9.lib(cbaseprogram.obj) : error LNK2001: unresolved external symbol __ftol2 d3dx9.lib(cprogram.obj) : error LNK2001: unresolved external symbol __ftol2 … 등 오류 발생 시  Project=>Setting => Link => Object/Library Module 에서 d3d9.lib d3dx9d.lib winmm.lib 으로 해야 함 2010-1학기 컴퓨터게임(DirectX)

7 PART 1 One 수 학 적 준 비

8 수 학 적 준 비 목 표 기하학과 벡터의 대수학, 그래픽에 응용되는 방법
수 학 적 준 비 목 표 기하학과 벡터의 대수학, 그래픽에 응용되는 방법 행렬과 행렬의 대수학, 3D 기하정보의 변환에 행렬 이용 방법 평면과 광선을 대수적으로 모델링 하는 방법, 3D 그래픽에 응용하는 방법 3D 수학 연산에 사용되는 D3DX 라이브러리의 클래스와 함수 2010-1학기 컴퓨터게임(DirectX)

9 3- 공간의 벡터 벡터 : 방향을 가진 선분 길이, 방향의 두 가지 속성을 가짐 벡터 u 와 벡터 v 는 동일하다.
위치는 벡터의 속성이 아님 벡터 u 와 벡터 v 는 동일하다. 머리 벡터 u 벡터 v 꼬리 2010-1학기 컴퓨터게임(DirectX)

10 왼손 좌표 시스템과 오른쪽 좌표 시스템 Z 축 방향의 차이로 인한 구별 왼손 시스템 양의 Z 좌표가 내가 보는 방향임
오른손 시스템 양의 Z 좌표가 나를 향함 Y Y z X x z 왼손 좌표계 오른손 좌표계 2010-1학기 컴퓨터게임(DirectX)

11 벡터의 꼬리가 원점과 일치하면 벡터가 표준점에 위치한 것이라 함
벡터가 표준점 내에 위치하면 머리점의 좌표를 확인하는 방법으로 벡터를 기술할 수 있게 됨 이 좌표들을 벡터의 성분이라 한다. 2, 3, 4차원 벡터의 표시 예 U = (Ux, Uy), N = (Nx, Ny, Nz), C = (Cx, Cy, Cz, Cw) 2010-1학기 컴퓨터게임(DirectX)

12 표준점에 고정된 벡터들은 특정 좌표 시스템과의 관계로 기술할 수 있다.
포인트와 벡터를 혼동하는 일이 발생하면 안됨 포인트는 시스템 내의 한 위치 나타냄 벡터는 크기와 방향을 가짐 Y c a X u = v b 2010-1학기 컴퓨터게임(DirectX)

13 특별한 3D 벡터 0 벡터. 모든 성분이 0, 0 벡터는 0 으로 표시 Ex) 0 = (0, 0, 0)
3좌표의 표준 기저 벡터 i, j, k 벡터 모두 1의 크기를 가짐 i = (1, 0, 0), j = (0, 1, 0), k = (0, 0, 1) 크기를 1로 가지는 벡터를 단위벡터라 함. k j i 2010-1학기 컴퓨터게임(DirectX)

14 D3DXVECTOR3 클래스 이용 typedef struct D3DXVECTOR3 : public D3DVECTOR {
D3DXVECTOR3(CONST FLOAT *); D3DXVECTOR3(CONST D3DVECTOR &); D3DXVECTOR3(FLOAT x, FLOAT y, FLOAT z); //형 변환 operator FLOAT*(); operator CONST FLOAT * () const; 2010-1학기 컴퓨터게임(DirectX)

15 D3DXVECTOR3& operator += (CONST D3DXVECTOR3&);
// 할당 연산자 D3DXVECTOR3& operator += (CONST D3DXVECTOR3&); D3DXVECTOR3& operator -= (CONST D3DXVECTOR3&); D3DXVECTOR3& operator *= (FLOAT); D3DXVECTOR3& operator /= (FLOAT); // 단항 연산자 D3DXVECTOR3 operator + () const; D3DXVECTOR3 operator - () const; // 이항 연산자 D3DXVEcTOR3 operator + (CONST D3DXVECTOR3 &) const; D3DXVEcTOR3 operator - (CONST D3DXVECTOR3 &) const; 2010-1학기 컴퓨터게임(DirectX)

16 D3DXVECTOR3 operator * (FLOAT) const;
friend D3DXVECTOR3 operator * (FLOAT, CONST struct D3DXVECTOR3 &); BOOL operator == (CONST D3DVECTOR3 &) const; BOOL operator != (CONST D3DXVECTOR &) const; } D3DXVECTOR3, *LPD3DXVECTOR3; 2010-1학기 컴퓨터게임(DirectX)

17 D3DX 라이브러리에서는 3 공간 내의 벡터를 표현하기 위해 D3DXVECTOR3 클래스 이용
typedef struct _D3DVECTOR { float x; float y; float z; } D3DVECTOR; D3DVECTOR3는 D3DVECTOR에서 성분 데이터 상속 2D와 4D 벡터 표현을 위한 D3DXVECTOR2, D3DXVECTOR4 클래스 제공 2010-1학기 컴퓨터게임(DirectX)

18 벡터 상등 기하학적으로는 같은 방향, 같은 길이의 두 벡터는 동일한 것이나,
기하학적으로는 같은 방향, 같은 길이의 두 벡터는 동일한 것이나, 대수적 으로는 벡터가 동일한 차원, 대응 성분이 같은 경우에 두 벡터를 동일한 것으로 봄 ux = vx, uy = vy, uz = vz라면 (ux, uy, uz) = (vx, vy, vz) 동등 연산자(오버로딩된)를 이용해 같은지 확인 D3DXVECTOR u(1.0f, 0.0f, 1.0f); D3DXVECTOR v(0.0f, 1.0f, 0.0f); if(u == v) return true; 2010-1학기 컴퓨터게임(DirectX)

19 부동 소수점의 부정확성 때문에 같은 것으로 생각되는 것도 다를 수가 있다.
부동 소수점 수를 비교할 때에는 주의 부동 소수점의 부정확성 때문에 같은 것으로 생각되는 것도 다를 수가 있다. 따라서 두 수가 대략적으로 같은지를 확인해야 함 매우 작은 값인 EPSILON 상수를 버퍼로 사용하는데 두 수의 거리가 EPSILON보다 작을 경우 같은 것 D3DXVECTOR3 클래스를 이용할 때에는 오버로드된 비교연산자가 다음 작업을 자동으로 수행 2010-1학기 컴퓨터게임(DirectX)

20 const float EPSILON = 0.001f; bool Equals(float lhs, float rhs) {
// 만약 lhs == rhs 라면 두 수의 차이는 0이어야 한다 return fabs(lhs - rhs) < EPSILON ? true : false; } 2010-1학기 컴퓨터게임(DirectX)

21 백터의 크기 계산 벡터의 크기는 방향을 가진 선분의 길이
벡터의 성분이 주어졌을 때, 다음 식을 이용해 벡터의 크기를 계산할 수 있다. |u| = ux + uy + uz D3DX 라이브러리를 이용할 때는 다음을 이용 FLOAT D3DXVec3Lenth(CONST D3DXVECTOR3* pv); D3DXVECTOR3 v(1.0f, 2.0f, 3.0f); float magnitude = D3DXVec3Length(&v); 2 2 2 2010-1학기 컴퓨터게임(DirectX)

22 벡터의 정규화 ^ 벡터의 크기를 1로 만들어 단위 벡터가 되도록 함 벡터의 각 성분을 벡터의 크기로 나눔 u = =
D3DX 라이브러리를 이용할 때는 다음 함수를 통해 벡터를 정규화 할 수 있다. D3DXVECTOR3 * D3DXVec3Normalize( D3DXVECTOR3* pOut, CONSTD3DXVECTOR3* pV ); u |u| ux uy uz ^ |u| |u| |u| 2010-1학기 컴퓨터게임(DirectX)

23 벡터 더하기 성분을 더하면 두개의 벡터를 더할 수 있다. u + v = (ux + vx, uy + vy, uz + vz);
코드 내에서 벡터를 더하기 위해서는 오버로드 된 덧셈 연산자 이용 u + v u v 2010-1학기 컴퓨터게임(DirectX)

24 D3DXVECTOR3 u(2.0f, 0.0f, 1.0f); D3DXVECTOR3 v(0.0f, -1.0f, 5.0f);
D3DXVECTOR3 sum = u + v; // u, v (벡터 변수) // = (2.0f, -1.0f, 6.0f) 2010-1학기 컴퓨터게임(DirectX)

25 벡터 빼기 더하기와 비슷하게 벡터의 대응되는 성분을 빼는 방법으로 벡터 빼기를 수행할 수 있다.
반드시 동일한 차원을 가져야 한다. u – v = u + (-v) = (ux - vx, uy - vy, uz - vz); u u - v D3DXVECTOR3 u(2.0f, 0.0f, 1.0f); D3DXVECTOR3 v(0.0f, -1.0f, 5.0f)); D3DXVECTOR3 difference= u - v; v -v 2010-1학기 컴퓨터게임(DirectX)

26 스칼라 곱 벡터는 스칼라로 곱하는 것이 가능 이를 통해 벡터의 배율이 변경 됨 음수를 곱하는 경우 방향이 바뀜
ku = (kux, kuy, kuz); D3DXVECTOR3 u(1.0f 1.0f, -1.0f); D3DXVECTOR3 scaleVec = u * 10.0f; 2010-1학기 컴퓨터게임(DirectX)

27 내 적 u • v = ux·vx + uy·vy + uz·vz = s
코사인의 법칙을 이용하면 u • v = |u|*|v| 관계 발견 u와 v과 모두 단위 벡터일 경우 u • v 두 벡터 간의 코사인이 된다. 내적의 특성 u • v = 0 라면 u  v 이다. u • v > 0 라면 두 벡터간의 각도  는 90보다 작다. u • v < 0 라면 두 벡터간의 각도  는 90보다 크다. 2010-1학기 컴퓨터게임(DirectX)

28 D3DX함수를 이용해 벡터간의 내적 구할 수 있다.
FLOAT D3DXVec3Dot( CONST D3DXVECTOR 3* pV1; CONST D3DXVECTOR 3* pV2; ); D3DXVECTOR3 u(1.0f, -1.0f, 0.0f); D3DXVECTOR3 v(3.0f, 2.0f, 1.0f); float dot = D3DXVec3Dot(&u, &v); 2010-1학기 컴퓨터게임(DirectX)

29 외 적 u와 v 두 벡터의 외적을 수행하면 다른 벡터인 p를 얻으며, 서로 직각을 이룬다. p = u x v
= [(uy*vz-uz*vy), (uz*vx-ux*vz), (ux*vy-uy*vx)] u x v v u 2010-1학기 컴퓨터게임(DirectX)

30 다음의 D3DX 함수를 이용하면 두 벡터간의 외적 계산 할 수 있다.
D3DXVEDCTOR3 *D3DXVec3Cross( D3DXVECTOR3 * pOut, CONST D3DXVECTOR3* pV1, CONST D3DXVECTOR3* pV2); 2010-1학기 컴퓨터게임(DirectX)

31 행 렬 M x N 행렬을 m행과 n열을 가지는 일반적인 배열 3 x 3 행렬 M, 2 x 4 행렬 B를 본다. M = B =
행 렬 M x N 행렬을 m행과 n열을 가지는 일반적인 배열 3 x 3 행렬 M, 2 x 4 행렬 B를 본다. M = B = 한 개의 행이나 열만을 가지는 행렬도 가능 이를 행 벡터, 열 벡터라고 부름 V = U = M11 m12 m13 M21 m22 m23 M31 m32 m33 B11 B12 B13 B14 B21 B22 B23 B24 V11 V12 V13 V14 v11 V12 V13 V14 2010-1학기 컴퓨터게임(DirectX)

32 상등 스칼라 곱, 더하기 동일한 차원을 가지고 각각의 대응되는 항목이 같은 두 개의 행렬을 같은 것으로 취급
동일한 차원을 가지고 각각의 대응되는 항목이 같은 두 개의 행렬을 같은 것으로 취급 A = C, A  B, A  D 행렬의 각 항목을 스칼라로 곱하는 방법으로 행렬을 스칼라 곱할 수 있다. kD = 5 -2 3 2 5 -8 5 -2 3 D = A = B = C = K(1) k(2) k(-1) k(3) K(-6) k(3) k(0) k(0) 2010-1학기 컴퓨터게임(DirectX)

33 행렬이 동일한 차원을 가진 경우에는 두 행렬을 더할 수 있다.
행렬이 동일한 차원을 가진 경우에는 두 행렬을 더할 수 있다. A + B = = 더하기와 마찬가지로 빼기도 같은 방법으로 수행 5 -2 3 2 5 -8 + (-8) 2010-1학기 컴퓨터게임(DirectX)

34 곱 행렬 곱은 3D 컴퓨터 그래픽에서 행렬을 이용하기 위한 가장 중요한 연산이다.
행렬 곱은 벡터의 변환을 수행하거나 몇 가지의 변환을 조합하는데 이용된다. 행렬 곱 AB를 얻기 위해서는 A의 열 수와 B이 행 수가 반드시 같아야 한다. 2x3, 3x3 차원을 가지는 A와 B의 두 행렬 곱의 예 2010-1학기 컴퓨터게임(DirectX)

35 곱셈 AB의 경우에는 A의 열 수와 B의 행 수가 일치
B11 B12 B13 B21 B22 B23 B31 B32 B33 A11 A12 A13 A21 A22 A23 A = B = 곱셈 AB의 경우에는 A의 열 수와 B의 행 수가 일치 곱셈 정의 가능 하지만 BA곱은 불가능: B의 열 수와 A의 행 수가 일치 않음 AB = = 4 1 -2 1 1 3 2 1 a1• b1 a1• b2 a2• b1 a2• b2 (4 1) • (1 2) (4 1) • (3 1) (-2 1) • (1 2) (-2 1) • (3 1) 2010-1학기 컴퓨터게임(DirectX)

36 항 등 행 렬(identity matrix)
중심 대각선을 제외한 모든 항목이 0인 정방 행렬 중심 대각선의 항목들은 모두 1 2x2, 3x3, 4x4 항등행렬의 예 항등 행렬은 곱셈의 항등성을 가짐 MI = IM = M 1 0 0 1 2010-1학기 컴퓨터게임(DirectX)

37 역 행 렬 행렬에는 나누기와 비교할 수 있는 연산 없으나 곱하기와 반대의 의미를 가지는 역 연산이 존재
정방 행렬만이 역행렬을 가질 수 있다. n x n 행렬 M의 역행렬 n x n은 M-1 으로 표기 모든 정방행렬이 역행렬을 가지지는 않는다. 행렬과 역행렬을 곱하면 항등 행렬을 얻는다. MM = M · M-1 = I 곱의 역에 대한 유용한 특성 (AB)-1 = B-1 A-1 , A와 B가 모두 역성이며 동일한 차원의 정방 행렬이라고 가정 -1 2010-1학기 컴퓨터게임(DirectX)

38 행렬의 전치(transpose) 행렬의 열과 행을 교환하면 행렬의 전치를 수행 mxn 행렬의 전치는 nxm 행렬
행렬 M 의 전치는 MT 로 표시 A = B = AT = BT = -1 8 a, b, c d, e, f g, h, i 3 -1 6 8 -4 a, d, g b, e, h c, f, i 2010-1학기 컴퓨터게임(DirectX)

39 D3DX 행렬 Direct3D 애플리케이션 프로그래밍 할 때는 4 x 4 행렬과 1 x 4 행 벡터만을 이용
벡터-행렬곱 v 가 1 x 4 행렬이면, 곱 vT가 정의, 결과는 1 x 4 행 벡터가 된다. 행렬-행렬곱 T가 4 x 4 행렬이고 R이 4 x 4 행렬이라면, 곱 TR과 RT가 모두 정의, 두 가지 모두 4 x 4행렬이 된다. 행렬곱은 상호 교환적이지 않으므로 TR 곱이 RT와 같을 필요는 없다. D3DX 에서 벡터를 나타내기 위해 D3DXVECTOR3 와 D3DXVECTOR4 벡터 클래스 이용 2010-1학기 컴퓨터게임(DirectX)

40 D3DXMATRIX 클래스 typedef struct D3DXMATRIX : public D3DMATRIX { public :
D3DXMATRIX(CONST FLOAT*); D3DXMATRIX(CONST D3DXMATRIX&); D3DXMATRIX(FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14, FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24, FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34, FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44); 2010-1학기 컴퓨터게임(DirectX)

41 FLOAT & operator() (UINT Row, UINT Col);
// 접근 허가 FLOAT & operator() (UINT Row, UINT Col); FLOAT & operator() (UINT Row, UINT Col) const; // 형 변환 연산자 operator FLOAT* (); operator CONST FLOAT* () const; // 할당 연산자 D3DXMATRIX& operator *= (CONST D3DXMATRIX&); D3DXMATRIX& operator += (CONST D3DXMATRIX&); D3DXMATRIX& operator -= (CONST D3DXMATRIX&); D3DXMATRIX& operator *= (FLOAT); 2010-1학기 컴퓨터게임(DirectX)

42 D3DXMATRIX& operator /= (FLOAT); // 단항 연산자
D3DXMATRIX operator + () const; D3DXMATRIX operator - () const; // 이항 연산자 D3DXMATRIX operator * (CONST D3DXMATRIX&) const; D3DXMATRIX operator - (CONST D3DXMATRIX&) const; D3DXMATRIX operator + (CONST D3DXMATRIX&) const; D3DXMATRIX operator * (FLOAT) const; D3DXMATRIX operator / (FLOAT) const; 2010-1학기 컴퓨터게임(DirectX)

43 D3DXMATRIX 클래스는 다음과 같이 정의된 D3DMATRIX 구조체에서 데이터 항목을 상속
friend D3DXMATIRX operator * (FLOAT, CONST D3DXMATRIX&); BOOL operator == (CONST D3DXMATRIX&); BOOL operator != (CONST D3DXMATRIX&); } D3DXMATRIX, *LPD3DXMATRIX; D3DXMATRIX 클래스는 다음과 같이 정의된 D3DMATRIX 구조체에서 데이터 항목을 상속 2010-1학기 컴퓨터게임(DirectX)

44 typedef struct _D3DMATRIX{ union{ struct{ float _11, _12, _13, _14;
}; float m[4][4]; } D3DMATRIX; 2010-1학기 컴퓨터게임(DirectX)

45 D3DX 라이브러리는 이외에도 항등행렬 지정, 전치, 역행렬 찾는 유용한 함수 포함.
D3DXMATRIX 클래스 행렬의 동일함 확인 더하기, 빼기, 스칼라로 행렬 곱하기, 형 변환 두 개의 D3DXMATRIX를 곱하는 등의 유용한 연산자들을 다수 포함 D3DX 라이브러리는 이외에도 항등행렬 지정, 전치, 역행렬 찾는 유용한 함수 포함. 2010-1학기 컴퓨터게임(DirectX)

46 D3DXMATRIX * D3DXMatrixIdentity(D3DXMATRIX *pout); D3DXMATRIX M;
D3DXMatrixIdentity(&M); // 항등행렬 지정 D3DXMATRIX *D3DXMatrixtranspose(D3DXMATRIX *pout, CONST D3DXMATRIX *pM); D3DXMATRIX A(…); D3DXMATRIX B; D3DXMatrixTranspose(&B, &A); D3DXMATRIX *D3DXMatrixInverse( D3DXMATRIX *pOut, FLOAT *pDeterminant, CONST D3DXMATRIX *pM); // pM의 역행렬 리턴, 다음 인자는 행렬식, 다음, 뒤집을 행렬 2010-1학기 컴퓨터게임(DirectX)

47 D3DXMatrixinverse(&B, 0, &A); // B = inverse(A);
D3DXMATRIX A(…); D3DXMATRIX B; D3DXMatrixinverse(&B, 0, &A); // B = inverse(A); 2010-1학기 컴퓨터게임(DirectX)

48 기본적인 변환 Direct3D 에서는 변환을 표현 위해 4x4 행렬 이용 행렬의 4번째 인자(w)의 성분
반면에 벡터는 위치를 가지지 않으므로 벡터의 이동은 정의될 수 없음 W = 0 으로 표기되어야 함. 포인트 이동이 바르게 처리되기 위해서는 w = 1 벡터 이동을 막기 위해서는w = 0 을 지정해야 함 2010-1학기 컴퓨터게임(DirectX)

49 이동 행렬 (x,y,z,1) 벡터를 다음과 같은 행렬로 곱하면 x,y,z로 px, py, pz만큼 이동할 수 있다.
T(p) = 이 동 px py pz 1 2010-1학기 컴퓨터게임(DirectX)

50 이동 행렬 D3DXMATRIX* D3DXMatrixTranslation( D3DXMATRIX* pOut,
FLOAT x, // x 축으로 이동할 단위의 수 FLOAT y, // y 축으로 이동할 단위의 수 FLOAT z // z 축으로 이동할 단위의 수 ); 2010-1학기 컴퓨터게임(DirectX)

51 회 전 행 렬 이동 벡터 p의 부호를 바꾸는 것은 이동행렬의 역행렬로 구함 T = T(-p) = 1 0 0 0 0 1 0 0
-px -py -pz 1 -1 회 전 2010-1학기 컴퓨터게임(DirectX)

52 회전 행렬 D3DXMATRIX* D3DXMatrixRotationX( D3DXMATRIX* pOut, // 결과
FLOAT Angle); // 라디안으로 측정한 회전각 D3DXMATRIX* D3DXMatrixRotationY( D3DXMATRIX* D3DXMatrixRotationZ( 2010-1학기 컴퓨터게임(DirectX)

53 모든 축으로 회전 가능(라디안값 사용) X() = Y() = Z() =
D3DXMATRIX *D3DXMatrixRotationX( D3DXMATRIX* pOut, FLOAT Angle); 0 cos  sin  0 0 -sin  cos  0 D3DXMATRIX *D3DXMatrixRotationY( D3DXMATRIX* pOut, FLOAT Angle); cos 0 -sin 0 sin cos 0 D3DXMATRIX *D3DXMatrixRotationZ( D3DXMATRIX* pOut, FLOAT Angle); cos sin -sin cos 2010-1학기 컴퓨터게임(DirectX)

54 크기 변환 행렬 S(q) = 크기 변형 qx 0 0 0 0 qy 0 0 0 0 qz 0 0 0 0 1 2010-1학기
2010-1학기 컴퓨터게임(DirectX)

55 D3DXMATRIX *DeDXMatrixScaling( D3DXMATRIX* pOut;
FLOAT sx, // x축 크기 변형 단위 FLOAT sy, // y축 크기 변형 단위 FLOAT sz ); // z축 크기 변형 단위 크기 변형 행렬의 역은 각 크기인자의 역으로 구함 S-1= S( ) = qx , qy , qz 1/qx /qy /qz 0 2010-1학기 컴퓨터게임(DirectX)

56 변환 조합하기 하나의 벡터에 일련의 변환을 적용해야 하는 경우가 많다.
하나의 벡터에 일련의 변환을 적용해야 하는 경우가 많다. 벡터의 배율을 변경하고 회전한 다음 이동. 벡터 p = [5, 0, 0, 1]을 모든 축으로 1/5 크기로 배율 변경, y축으로 ∏ /4 라디안 만큼 회전, x 축으로 1단위, y축으로2단위 ,z 축으로 3단위 만큼 이동하라 2010-1학기 컴퓨터게임(DirectX)

57 크기, 회전, 이동 행렬을 (S,Ry,T)를 구성하자. S(- - -) = a, b, c
크기변형, 회전, 이동을 수행해야 함 크기, 회전, 이동 행렬을 (S,Ry,T)를 구성하자. S( ) = a, b, c Ry( - ) = a b c 5 , 5 , 5 ∏ 4 2010-1학기 컴퓨터게임(DirectX)

58 크기 변형과 회전, 이동을 위한 변환 순서를 차례로 적용하면 다음과 같은 결과 얻는다.
T(1, 2, -3) = 크기 변형과 회전, 이동을 위한 변환 순서를 차례로 적용하면 다음과 같은 결과 얻는다. ps = [1,0,0,1] = p’ p’Ry = [ , ] = p’’ p’’T = [1.707 , 2, , 1] 2010-1학기 컴퓨터게임(DirectX)

59 행렬의 한 가지 중요한 이점은 행렬 곱을 이용하여 몇가지의 변환을 하나의 행렬로 결합 가능
여기에서 변환을 위해 곱한 순서는 최종적으로 적용되는 변환의 순서가 된다. SRyT = = = Q a 0 b c 0 2010-1학기 컴퓨터게임(DirectX)

60 여러 개의 변환을 하나의 변환으로 결합하는 능력은 성능에 큰 영향을 준다.
결국 pQ = [1.707, 2, , 1] 이 된다. 여러 개의 변환을 하나의 변환으로 결합하는 능력은 성능에 큰 영향을 준다. 연산을 획기적으로 줄임 2010-1학기 컴퓨터게임(DirectX)

61 벡터 변환을 위한 몇 가지 함수들 D3DX 라이브러리는 포인트와 벡터 변환을 위한 두 개의 함수를 제공
D3DXVec3TransformCoord 포인트 변환, 벡터의 네번째 성분이 1로 인식된다고 가정 D3DVec3TransformNormal 벡터를 변환, 벡터의 네번째 성분이 0이라고 인식 2010-1학기 컴퓨터게임(DirectX)

62 D3DXVECTOR3 * D3DVec3TransformCoord{
D3DXVECTOR3* pOut; CONST D3DXVECTOR3* pV, CONST D3DXMATRIX *pM }; D3DXMATRIX T(…); D3DXVECTOR3 p(…); D3DXVec3TransformCoord(&p, &p, &T); D3DXVECTOR3 *WINAPI D3DXVec3TransformNormal( D3DXVECTOR3 *pOut; CONST D3DXVECTOR3 *pV, CONST D3DXMATRIX *pM }; // 결과, 변환할 벡터, 행렬 D3DXMATRIX v(…); D3DXVec3TransformCoord(&v, &v , &T); 2010-1학기 컴퓨터게임(DirectX)

63 평면 하나의 벡터 n과 평면 상의 포인트 p0로 표현 벡터 n은 평면의 법선 벡터라고 부르며 평면과 수직을 이룬다. n p0
2010-1학기 컴퓨터게임(DirectX)

64 다음은 포인트 p가 방정식을 만족시키고 있음을 보여준다.
N • (p – p0) = 0 p P0 P 2010-1학기 컴퓨터게임(DirectX)

65 특정 평면을 표현하는 데 있어 법선n과 평면 상의 알려진 포인트 p0은 고정된다.
따라서 위의 식을 다음과 같이 작성하는 것이 일반적이다. n • p + d = 0 평면의 법선을 벡터 n이 단위 길이일 경우, d = -n • p0 으로 원점에서 평면까지의 부호를 가진 가장 짧은 거리를 얻을 수 있다. 2010-1학기 컴퓨터게임(DirectX)

66 D3DXPLANE 코드에서 평면을 표현할 때는 법선 벡터 n과 상수 d를 보관하는 것으로 충분하다.
typedef struct D3DXPLANE { # ifdef __cplusplus public : D3DXPLANE() {} D3DXPLANE(CONST FLOAT *); 2010-1학기 컴퓨터게임(DirectX)

67 D3DXPLANE(CONST D3DXPLOAT16 *);
D3DXPLNAE(FLOAT a, FLOAT b, FLOAT c, FLOAT d); // 형변환 operator FLOAT*(); operator CONST FLOAT * () const; // 단항연산자 D3DXPLANE operator +() const; D3DXPLANE operator –() const; //이항 연산자 BOOL operator == (CONST D3DXPLANE&) const; BOOL operator != (CONST D3DXPLANE&) const; #endif FLOAT a, b, c, d; // a, b, c는 평면의 법선벡터 n의 성분, d는 상수 }D3DXPLANE, *LPD3DXPLANE; 2010-1학기 컴퓨터게임(DirectX)

68 포인트와 평면 공간의 관계 평면에서 포인트의 상대적 위치를 테스트 하는데 매우 유용하다.
n• p + d = 0; n • p + d = 0 이면 평면에 있다. n • p + d > 0 이면 평면의 앞쪽 양의 절반 공간 n • p + d < 0 이면 평면의 뒤쪽 음의 절반 공간 2010-1학기 컴퓨터게임(DirectX)

69 n• p + d로 평면에서 포인트 p까지의 부호를 가진 가장 짧은 거리를 얻을 수 있다.
FLOAT D3DXPlaneDotCoord( CONST D3DXPLANE *pP, CONST D3DXVECOTR *pV ); 2010-1학기 컴퓨터게임(DirectX)

70 Float x = D3DXPlaneDotCoord(&p, &v);
// 평면에 상대적인 포인트 위치를 테스트 D3DXPLANE p(0.0f, 1.0f, 0.0f, 0.0f); D3DXVECTOR3 v(3.0f, 5.0f, 2.0f); Float x = D3DXPlaneDotCoord(&p, &v); If(x approximately equals 0.0f) // v는 평면과 공면 If(x > 0) // v는 양의 절반 공간 If(x < 0) // v는 음의 절반 공간 2010-1학기 컴퓨터게임(DirectX)

71 부동 소수점의 부정확성으로 인해 “대략적으로 같은”의 개념을 이용
부동 소수점의 부정확성으로 인해 “대략적으로 같은”의 개념을 이용 D3DXPlaneDotCoord와 비슷한 메서드로는 D3DXPlaneDot와 D3DXPlaneDotNormal이 있다. 2010-1학기 컴퓨터게임(DirectX)

72 평면 구축 법선과 평면의 부호 거리를 곧바로 지정하는 방법 이외에도 이를 계산하는 두 가지 방법이 있다.
n • p0 + d = 0 n • p0 = -d -n • p0 = d D3DX 라이브러리는 이 계산을 위한 함수 제공 D3DXPLANE * D3DXPlaneFromPointNormal( D3DXPLANE* pOut, CONST D3DXVECTOR3* pPoint, CONST D3DXVECTOR3* pNormal); 2010-1학기 컴퓨터게임(DirectX)

73 평면을 구축하는 두 번째 방법은 평면 상의 세 개의 포인트를 지정하는 것이다.
p0, p1, p2 포인트가 있다면, 평면상의 두 개의 벡터를 구성할 수 있다. u = p1 – p0 v = p2 – p0 이제 평면상에 있는 두 벡터의 외적을 얻으면 법선이 계산된다. n = u x v 2010-1학기 컴퓨터게임(DirectX)

74 D3DX 라이브러리는 평면상의 세 개의 포인트를 이용해 평면을 계산하는 다음과 같은 함수 제공
D3DXPLANE *D3DXPlaneFromPoints( D3DXPLANE* pOut, // 결과 CONST D3DXVECTOR3* pV1, // 평면상의 포인트1 CONST D3DXVECTOR3* pV2, // 평면상의 포인트2 CONST D3DXVECTOR3* pV3 // 평면상의 포인트3 ); 2010-1학기 컴퓨터게임(DirectX)

75 평면 정규화 n • p + d = 0 와 d = -n • p0 법선 벡터의 길이가 상수 d에 영향을 주기 때문에 법선 벡터를 정규화 하면 d 역시 다시 계산해야 함 - (n, d) = ( - , - ) 다음은 평면 법선 벡터를 정규화 하기 위해 사용되는 D3DX 함수이다. D3DXPLANE *D3DXPlaneNormalize( D3DXPLANE *pOut, // 정규화된 결과 평면 CONST D3DXPLANE *pP // 입력 평면 ); 1 |n| n |n| d |n| 2010-1학기 컴퓨터게임(DirectX)

76 평면 변환 ^ 평면(n, d)를 4D 벡터로 취급하고 원하는 변환 행렬의 역-전치와 곱함으로써 평면을 변환 가능
D3DX 함수가 사용된다. D3DXPLANE* D3DXPlaneTransform( D3DXPLANE *pOut, // 결과 CONST D3DXPLANE *pP, // 입력 평면 CONST D3DXMATRIX *pM ); // 변환 행렬 ); 2010-1학기 컴퓨터게임(DirectX)

77 평면에서 특정 포인트와 가장 가까운 포인트 공간에 하나의 포인트 p를 가지고 있고 p와 가장 가까운 평면(n, d) 상의 포인트 q를 찾으려 한다고 가정해 보자. 여기에서는 평면의 법선 벡터가 단위 길이라고 가정함 ^ 2010-1학기 컴퓨터게임(DirectX)

78 q = p + (-kn) 이며 , k는 p에서 평면으로의 부호가 있는 가장 잛은 거리
Y q = p + (-kn) 이며 , k는 p에서 평면으로의 부호가 있는 가장 잛은 거리 포인트 p와 q사이의 가장 짧은 부호가 있는 거리 (n, d) q n -kn kn p x 2010-1학기 컴퓨터게임(DirectX)

79 광 선 게임에서 총을 쏘는 기능을 만들 때 특정 위치에서 어떤 방향으로 발사된 총알이 타겟에 맞았는지를 확인하는 방법
특정 위치에서 어떤 방향으로 발사된 총알이 타겟에 맞았는지를 확인하는 방법 광선으로 총알을 모델링하고 적을 경계 구체로 모델링 하는 것 2010-1학기 컴퓨터게임(DirectX)

80 광 선 관점과 방향을 이용하면 광선을 표시할 수 있다. p(t) = p0 + tu P0 + 3U P0+2U P0+U P0 U
2010-1학기 컴퓨터게임(DirectX)

81 P0는 광선의 원점이며 u는 광선의 방향이고 T는 매개 변수이다.
0보다 작은 값을 이용하면 광선 뒤쪽에 포인트 만들어짐 2010-1학기 컴퓨터게임(DirectX)

82 광선/평면 교차 광선 p(t) = p0 + tu와 평면 n • p +d =0이 있다고 할 때
교차하는지를 알기 위해서는 평면 방정식에 광선을 넣고 방정식을 만족시키는 매개 변수 t를 풀어내면 됨 2010-1학기 컴퓨터게임(DirectX)

83 n • p(t) + d = 0 n• (p0+tu) + d = 0 n• p0 +n• tu + d = 0
n• tu = -d - (n • p0) t(n• u) = -d - (n • p0) t = -d - (n • p0) (n • u) 2010-1학기 컴퓨터게임(DirectX)

84 만약 t가 범위 [0, ∞) 내에 있지 않으면, 평면과 교차 하지 않는다.
범위 내에 있다면 평면 방정식을 만족시키는 매개 변수를 광선 방정식에 넣고 교차점을 얻을 수 있다. p( ) = p u -d - (n • p0) (n • u) -d - (n • p0) (n • u) 2010-1학기 컴퓨터게임(DirectX)


Download ppt "DirectX9를 이용한 3D GAME 프로그래밍 입문"

Similar presentations


Ads by Google