84

Click here to load reader

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

  • Upload
    anahid

  • View
    304

  • Download
    41

Embed Size (px)

DESCRIPTION

DirectX9 를 이용한 3D GAME 프로그래밍 입문. Frank D. Luna 저 최현호 역 , 김성완 감수 정보문화사 , 2004 강의노트 : vmlab.suwon.ac.kr/mwlee. DirectX 설치. DirectX 환경설정 설치 : DirectX 2004 년 버전 압축해제는 C:\DXSDK 로 , INCLUDE 및 LIB 파일 추가 도구 => 옵션 =>Directories 에서 INCLUDE/LIB 를 다음으로 설정 C:\DXSDK\INCLUDE - PowerPoint PPT Presentation

Citation preview

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

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

Frank D. Luna Frank D. Luna 저저최현호 역최현호 역 , , 김성완 감수김성완 감수

정보문화사정보문화사 , 2004, 2004

강의노트강의노트 : : vmlab.suwon.ac.kr/mwleevmlab.suwon.ac.kr/mwlee

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

2009-1 학기 컴퓨터게임 (DirectX) 2

DirectX DirectX 설치설치 DirectX DirectX 환경설정환경설정

• 설치설치 : DirectX 2004 : DirectX 2004 년 버전년 버전• 압축해제는 압축해제는 C:\DXSDK C:\DXSDK 로로 ,,

• INCLUDE INCLUDE 및 및 LIB LIB 파일 추가파일 추가 도구도구 =>=> 옵션옵션 =>Directories =>Directories 에서 에서

INCLUDE/LIB INCLUDE/LIB 를 다음으로 설정를 다음으로 설정 C:\DXSDK\INCLUDEC:\DXSDK\INCLUDE C:\DXSDK\LIBC:\DXSDK\LIB

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

2009-1 학기 컴퓨터게임 (DirectX) 3

예제 프로그램 사이트예제 프로그램 사이트 http://www.wordware.com/files/dx9/

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

2009-1 학기 컴퓨터게임 (DirectX) 4

DirectX DirectX 컴파일시 컴파일시 (Visual C++ 6.0)(Visual C++ 6.0)

여러 파일 추가시여러 파일 추가시• project => Add-to-project => Files project => Add-to-project => Files 에서 에서

해당 파일들 추가해당 파일들 추가

빌드시 링크해야 하는 것빌드시 링크해야 하는 것• project => Setting => Link project => Setting => Link 에서에서

d3d9.lib d3dx9.lib winmm.lib d3d9.lib d3dx9.lib winmm.lib 추가추가 console => windowsconsole => windows 로 변경로 변경

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

2009-1 학기 컴퓨터게임 (DirectX) 5

오류 처리 오류 처리 (1)(1) LIBCD.lib(crt0.obj) : error LNK2001: LIBCD.lib(crt0.obj) : error LNK2001:

unresolved external symbol _main unresolved external symbol _main 오류 오류 처리처리• Project => Setting => Link Project => Setting => Link 에서에서• console => windows console => windows 로 바꿈로 바꿈

d3dx9.lib(fastftoa.obj) : error LNK2001: d3dx9.lib(fastftoa.obj) : error LNK2001: unresolved external symbol __aulldvrmunresolved external symbol __aulldvrm

Debug/camera.exe : fatal error LNK1120: 1 Debug/camera.exe : fatal error LNK1120: 1 unresolved externalsunresolved externals

Error executing link.exe. Error executing link.exe. 오류 처리오류 처리• Project => Setting => Link Project => Setting => Link 에서에서• d3d9.lib d3dx9d.lib winmm.lib d3d9.lib d3dx9d.lib winmm.lib 추가 추가 (d3dx9 => (d3dx9 =>

d3dx9d d3dx9d 로 변경 링크로 변경 링크 ))

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

오류처리 오류처리 (2)(2) Linking...Linking...

d3dx9.lib(jidctflt.obj) : error LNK2001: unresolved external d3dx9.lib(jidctflt.obj) : error LNK2001: unresolved external symbol __ftol2symbol __ftol2d3dx9.lib(cshaderprogram.obj) : error LNK2001: unresolved d3dx9.lib(cshaderprogram.obj) : error LNK2001: unresolved external symbol __ftol2external symbol __ftol2d3dx9.lib(jcdctmgr.obj) : error LNK2001: unresolved d3dx9.lib(jcdctmgr.obj) : error LNK2001: unresolved external symbol __ftol2external symbol __ftol2d3dx9.lib(cbaseprogram.obj) : error LNK2001: unresolved d3dx9.lib(cbaseprogram.obj) : error LNK2001: unresolved external symbol __ftol2external symbol __ftol2d3dx9.lib(cprogram.obj) : error LNK2001: unresolved d3dx9.lib(cprogram.obj) : error LNK2001: unresolved external symbol __ftol2external symbol __ftol2… … 등 오류 발생 시 등 오류 발생 시

Project=>Setting => Link => Object/Library Module Project=>Setting => Link => Object/Library Module 에서에서• d3d9.lib d3dx9d.lib winmm.lib d3d9.lib d3dx9d.lib winmm.lib 으로 해야 함으로 해야 함

2009-1 학기 컴퓨터게임 (DirectX) 6

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

PART PART 11 One One

수 학 적 준 비수 학 적 준 비

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

2009-1 학기 컴퓨터게임 (DirectX) 8

수 학 적 준 비수 학 적 준 비 목 표목 표

• 기하학과 벡터의 대수학기하학과 벡터의 대수학 , , 그래픽에 응용되는 그래픽에 응용되는 방법방법

• 행렬과 행렬의 대수학행렬과 행렬의 대수학 , 3D , 3D 기하정보의 기하정보의 변환에 행렬 이용 방법변환에 행렬 이용 방법

• 평면과 광선을 대수적으로 모델링 하는 방법평면과 광선을 대수적으로 모델링 하는 방법 , , 3D 3D 그래픽에 응용하는 방법그래픽에 응용하는 방법

• 3D 3D 수학 연산에 사용되는 수학 연산에 사용되는 D3DX D3DX 라이브러리의 클래스와 함수라이브러리의 클래스와 함수

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

2009-1 학기 컴퓨터게임 (DirectX) 9

3- 3- 공간의 벡터공간의 벡터

• 벡터 벡터 : : 방향을 가진 선분방향을 가진 선분 길이길이 , , 방향의 두 가지 속성을 가짐방향의 두 가지 속성을 가짐

• 위치는 벡터의 속성이 아님위치는 벡터의 속성이 아님 벡터 벡터 u u 와 벡터 와 벡터 v v 는 동일하다는 동일하다 ..

벡터 v

벡터 u머리

꼬리

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

2009-1 학기 컴퓨터게임 (DirectX) 10

• 왼손 좌표 시스템과 오른쪽 좌표 시스템왼손 좌표 시스템과 오른쪽 좌표 시스템 Z Z 축 방향의 차이로 인한 구별축 방향의 차이로 인한 구별

• 왼손 시스템왼손 시스템 양의 양의 Z Z 좌표가 내가 보는 방향임좌표가 내가 보는 방향임

• 오른손 시스템오른손 시스템 양의 양의 Z Z 좌표가 나를 향함좌표가 나를 향함

왼손 좌표계 오른손 좌표계

Y

X

z

z

x

Y

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

2009-1 학기 컴퓨터게임 (DirectX) 11

벡터의 꼬리가 원점과 일치하면 벡터가 표준점에 벡터의 꼬리가 원점과 일치하면 벡터가 표준점에 위치한 것이라 함위치한 것이라 함

벡터가 표준점 내에 위치하면 머리점의 좌표를 벡터가 표준점 내에 위치하면 머리점의 좌표를 확인하는 방법으로 벡터를 기술할 수 있게 됨확인하는 방법으로 벡터를 기술할 수 있게 됨

이 좌표들을 벡터의 성분이라 한다이 좌표들을 벡터의 성분이라 한다 ..

2, 3, 42, 3, 4 차원 벡터의 표시 예차원 벡터의 표시 예

• U = (Ux, Uy), N = (Nx, Ny, Nz), C = (Cx, Cy, Cz, U = (Ux, Uy), N = (Nx, Ny, Nz), C = (Cx, Cy, Cz, Cw)Cw)

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

2009-1 학기 컴퓨터게임 (DirectX) 12

• 표준점에 고정된 벡터들은 특정 좌표 시스템과의 관계로 기술할 표준점에 고정된 벡터들은 특정 좌표 시스템과의 관계로 기술할 수 있다수 있다 . .

• 포인트와 벡터를 혼동하는 일이 발생하면 안됨포인트와 벡터를 혼동하는 일이 발생하면 안됨

포인트는 시스템 내의 한 위치 나타냄포인트는 시스템 내의 한 위치 나타냄 벡터는 크기와 방향을 가짐벡터는 크기와 방향을 가짐

X

Y

ac

bu = v

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

2009-1 학기 컴퓨터게임 (DirectX) 13

특별한 특별한 3D 3D 벡터벡터

• 0 0 벡터벡터 . . 모든 성분이 모든 성분이 0, 0 0, 0 벡터는 벡터는 0 0 으로 표시 으로 표시 Ex) 0 = (0, 0, 0)Ex) 0 = (0, 0, 0)

• 33 좌표의 표준 기저 벡터좌표의 표준 기저 벡터 i, j, k i, j, k 벡터벡터 모두 모두 11 의 크기를 가짐의 크기를 가짐 i = (1, 0, 0), j = (0, 1, 0), k = (0, 0, 1)i = (1, 0, 0), j = (0, 1, 0), k = (0, 0, 1) 크기를 크기를 11 로 가지는 벡터를 단위벡터라 함로 가지는 벡터를 단위벡터라 함 ..

i

kj

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

2009-1 학기 컴퓨터게임 (DirectX) 14

D3DXVECTOR3 D3DXVECTOR3 클래스 이용클래스 이용

typedef struct D3DXVECTOR3 : public D3DVECTOR {typedef struct D3DXVECTOR3 : public D3DVECTOR {

public :public :

D3DXVECTOR3(){};D3DXVECTOR3(){};

D3DXVECTOR3(CONST FLOAT *);D3DXVECTOR3(CONST FLOAT *);

D3DXVECTOR3(CONST D3DVECTOR &);D3DXVECTOR3(CONST D3DVECTOR &);

D3DXVECTOR3(FLOAT x, FLOAT y, FLOAT z);D3DXVECTOR3(FLOAT x, FLOAT y, FLOAT z);

//// 형 변환형 변환operator FLOAT*();operator FLOAT*();

operator CONST FLOAT * () const;operator CONST FLOAT * () const;

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

2009-1 학기 컴퓨터게임 (DirectX) 15

// // 할당 연산자할당 연산자D3DXVECTOR3& operator += (CONST D3DXVECTOR3&);D3DXVECTOR3& operator += (CONST D3DXVECTOR3&);

D3DXVECTOR3& operator -= (CONST D3DXVECTOR3&);D3DXVECTOR3& operator -= (CONST D3DXVECTOR3&);

D3DXVECTOR3& operator *= (FLOAT);D3DXVECTOR3& operator *= (FLOAT);

D3DXVECTOR3& operator /= (FLOAT);D3DXVECTOR3& operator /= (FLOAT);

// // 단항 연산자단항 연산자D3DXVECTOR3 operator + () const;D3DXVECTOR3 operator + () const;

D3DXVECTOR3 operator - () const;D3DXVECTOR3 operator - () const;

// // 이항 연산자이항 연산자D3DXVEcTOR3 operator + (CONST D3DXVECTOR3 &) D3DXVEcTOR3 operator + (CONST D3DXVECTOR3 &)

const;const;

D3DXVEcTOR3 operator - (CONST D3DXVECTOR3 &) const;D3DXVEcTOR3 operator - (CONST D3DXVECTOR3 &) const;

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

2009-1 학기 컴퓨터게임 (DirectX) 16

D3DXVECTOR3 operator * (FLOAT) const;D3DXVECTOR3 operator * (FLOAT) const;

D3DXVECTOR3 operator / (FLOAT) const;D3DXVECTOR3 operator / (FLOAT) const;

friend D3DXVECTOR3 operator * (FLOAT, friend D3DXVECTOR3 operator * (FLOAT,

CONST struct D3DXVECTOR3 &);CONST struct D3DXVECTOR3 &);

BOOL operator == (CONST D3DVECTOR3 &) const;BOOL operator == (CONST D3DVECTOR3 &) const;

BOOL operator != (CONST D3DXVECTOR &) const;BOOL operator != (CONST D3DXVECTOR &) const;

} D3DXVECTOR3, *LPD3DXVECTOR3;} D3DXVECTOR3, *LPD3DXVECTOR3;

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

2009-1 학기 컴퓨터게임 (DirectX) 17

• D3DX D3DX 라이브러리에서는 라이브러리에서는 3 3 공간 내의 벡터를 공간 내의 벡터를 표현하기 위해 표현하기 위해 D3DXVECTOR3 D3DXVECTOR3 클래스 이용클래스 이용

typedef struct _D3DVECTOR {typedef struct _D3DVECTOR {

float x;float x;

float y;float y;

float z;float z;

} D3DVECTOR;} D3DVECTOR;

D3DVECTOR3D3DVECTOR3 는 는 D3DVECTORD3DVECTOR 에서 성분 데이터 에서 성분 데이터 상속상속

2D2D 와 와 4D 4D 벡터 표현을 위한 벡터 표현을 위한 D3DXVECTOR2, D3DXVECTOR2, D3DXVECTOR4 D3DXVECTOR4 클래스 제공클래스 제공

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

2009-1 학기 컴퓨터게임 (DirectX) 18

벡터 상등벡터 상등 기하학적으로는 같은 방향기하학적으로는 같은 방향 , , 같은 길이의 두 벡터는 같은 길이의 두 벡터는

동일한 것이나 동일한 것이나 , , 대수적 으로는 벡터가 동일한 차원대수적 으로는 벡터가 동일한 차원 , , 대응 성분이 대응 성분이

같은 경우에 두 벡터를 동일한 것으로 봄같은 경우에 두 벡터를 동일한 것으로 봄• uuxx = v = vxx, u, uyy = v = vyy, u, uzz = v = vzz 라면 라면

• (u(uxx, u, uyy, u, uzz) = (v) = (vxx, v, vyy, v, vzz))

동등 연산자동등 연산자 (( 오버로딩된오버로딩된 )) 를 이용해 같은지 확인를 이용해 같은지 확인

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

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

if(u == v) return true;if(u == v) return true;

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

2009-1 학기 컴퓨터게임 (DirectX) 19

부동 소수점 수를 비교할 때에는 주의부동 소수점 수를 비교할 때에는 주의

부동 소수점의 부정확성 때문에 같은 것으로 부동 소수점의 부정확성 때문에 같은 것으로 생각되는 것도 다를 수가 있다생각되는 것도 다를 수가 있다 ..

따라서 두 수가 대략적으로 같은지를 확인해야 함따라서 두 수가 대략적으로 같은지를 확인해야 함• 매우 작은 값인 매우 작은 값인 EPSILON EPSILON 상수를 버퍼로 사용하는데 두 상수를 버퍼로 사용하는데 두

수의 거리가 수의 거리가 EPSILONEPSILON 보다 작을 경우 같은 것보다 작을 경우 같은 것• D3DXVECTOR3 D3DXVECTOR3 클래스를 이용할 때에는 오버로드된 클래스를 이용할 때에는 오버로드된

비교연산자가 다음 작업을 자동으로 수행비교연산자가 다음 작업을 자동으로 수행

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

2009-1 학기 컴퓨터게임 (DirectX) 20

const float EPSILON = 0.001f;const float EPSILON = 0.001f;

bool Equals(float lhs, float rhs)bool Equals(float lhs, float rhs)

{{ // // 만약 만약 lhs == rhs lhs == rhs 라면 두 수의 차이는 라면 두 수의 차이는 00 이어야 이어야

한다한다 return fabs(lhs - rhs) < EPSILON ? true : false;return fabs(lhs - rhs) < EPSILON ? true : false;

}}

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

2009-1 학기 컴퓨터게임 (DirectX) 21

백터의 크기 계산백터의 크기 계산 벡터의 크기는 방향을 가진 선분의 길이벡터의 크기는 방향을 가진 선분의 길이

벡터의 성분이 주어졌을 때벡터의 성분이 주어졌을 때 , , 다음 식을 이용해 다음 식을 이용해 벡터의 크기를 계산할 수 있다벡터의 크기를 계산할 수 있다 ..

• |u| = ux + uy + uz|u| = ux + uy + uz

D3DX D3DX 라이브러리를 이용할 때는 다음을 이용라이브러리를 이용할 때는 다음을 이용

FLOAT D3DXVec3Lenth(CONST D3DXVECTOR3* pv);FLOAT D3DXVec3Lenth(CONST D3DXVECTOR3* pv);

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

float magnitude = D3DXVec3Length(&v);float magnitude = D3DXVec3Length(&v);

2 2 2

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

2009-1 학기 컴퓨터게임 (DirectX) 22

벡터의 정규화벡터의 정규화

벡터의 크기를 벡터의 크기를 11 로 만들어 단위 벡터가 되도록 함로 만들어 단위 벡터가 되도록 함

벡터의 각 성분을 벡터의 크기로 나눔벡터의 각 성분을 벡터의 크기로 나눔

u = = u = =

D3DX D3DX 라이브러리를 이용할 때는 다음 함수를 통해 벡터를 라이브러리를 이용할 때는 다음 함수를 통해 벡터를 정규화 할 수 있다정규화 할 수 있다 ..

D3DXVECTOR3 * D3DXVec3Normalize(D3DXVECTOR3 * D3DXVec3Normalize(

D3DXVECTOR3* pOut,D3DXVECTOR3* pOut,

CONSTD3DXVECTOR3* pVCONSTD3DXVECTOR3* pV

););

^ ux uy uz

|u| |u| |u|

u

|u|

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

2009-1 학기 컴퓨터게임 (DirectX) 23

벡터 더하기벡터 더하기 성분을 더하면 두개의 벡터를 더할 수 있다성분을 더하면 두개의 벡터를 더할 수 있다 .. u + v = (ux + vx, uy + vy, uz + vz);u + v = (ux + vx, uy + vy, uz + vz);

코드 내에서 벡터를 더하기 위해서는 오버로드 된 코드 내에서 벡터를 더하기 위해서는 오버로드 된 덧셈 연산자 이용덧셈 연산자 이용

v

uu + v

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

2009-1 학기 컴퓨터게임 (DirectX) 24

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

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

D3DXVECTOR3 sum = u + v; // u, v (D3DXVECTOR3 sum = u + v; // u, v ( 벡터 변수벡터 변수 ))

// = (2.0f, -1.0f, 6.0f)// = (2.0f, -1.0f, 6.0f)

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

2009-1 학기 컴퓨터게임 (DirectX) 25

벡터 빼기벡터 빼기 더하기와 비슷하게 벡터의 대응되는 성분을 빼는 더하기와 비슷하게 벡터의 대응되는 성분을 빼는

방법으로 벡터 빼기를 수행할 수 있다방법으로 벡터 빼기를 수행할 수 있다 ..

• 반드시 동일한 차원을 가져야 한다반드시 동일한 차원을 가져야 한다 ..• u u –– v = u + (-v) = (ux - vx, uy - vy, uz - vz); v = u + (-v) = (ux - vx, uy - vy, uz - vz);

u

v

-v

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

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

D3DXVECTOR3 difference= u - v;

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

2009-1 학기 컴퓨터게임 (DirectX) 26

스칼라 곱스칼라 곱

벡터는 스칼라로 곱하는 것이 가능벡터는 스칼라로 곱하는 것이 가능

이를 통해 벡터의 배율이 변경 됨이를 통해 벡터의 배율이 변경 됨• 음수를 곱하는 경우 방향이 바뀜음수를 곱하는 경우 방향이 바뀜• ku = (kux, kuy, kuz);ku = (kux, kuy, kuz);

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

D3DXVECTOR3 scaleVec = u * 10.0f;D3DXVECTOR3 scaleVec = u * 10.0f;

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

2009-1 학기 컴퓨터게임 (DirectX) 27

내 적내 적 u u •• v = ux·vx + uy·vy + uz·vz = s v = ux·vx + uy·vy + uz·vz = s

코사인의 법칙을 이용하면 코사인의 법칙을 이용하면 u u •• v = |u|*|v| v = |u|*|v| 관계 관계 발견발견

• uu 와 와 vv 과 모두 단위 벡터일 경우 과 모두 단위 벡터일 경우 u u •• v v 두 벡터 간의 두 벡터 간의 코사인이 된다코사인이 된다 ..

내적의 특성내적의 특성• u u •• v = 0 v = 0 라면 라면 u u v 이다 .• u u •• v > 0 v > 0 라면 두 벡터간의 각도 라면 두 벡터간의 각도 는 90 보다 작다 .• u u •• v < 0 v < 0 라면 두 벡터간의 각도 라면 두 벡터간의 각도 는 90 보다 크다 .

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

2009-1 학기 컴퓨터게임 (DirectX) 28

D3DXD3DX 함수를 이용해 벡터간의 내적 구할 수 있다함수를 이용해 벡터간의 내적 구할 수 있다 ..

FLOAT D3DXVec3Dot(FLOAT D3DXVec3Dot(

CONST D3DXVECTOR 3* pV1;CONST D3DXVECTOR 3* pV1;

CONST D3DXVECTOR 3* pV2;CONST D3DXVECTOR 3* pV2;

););

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

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

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

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

2009-1 학기 컴퓨터게임 (DirectX) 29

외 적외 적 uu 와 와 v v 두 벡터의 외적을 수행하면 다른 벡터인 두 벡터의 외적을 수행하면 다른 벡터인 pp

를 얻으며를 얻으며 , , 서로 직각을 이룬다서로 직각을 이룬다 ..

• p = u x v p = u x v

= [(uy*vz-uz*vy), (uz*vx-ux*vz), (ux*vy-uy*vx)]= [(uy*vz-uz*vy), (uz*vx-ux*vz), (ux*vy-uy*vx)]

v

u

u x v

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

2009-1 학기 컴퓨터게임 (DirectX) 30

다음의 다음의 D3DX D3DX 함수를 이용하면 두 벡터간의 외적 함수를 이용하면 두 벡터간의 외적 계산 할 수 있다계산 할 수 있다 ..

D3DXVEDCTOR3 *D3DXVec3Cross(D3DXVEDCTOR3 *D3DXVec3Cross(

D3DXVECTOR3 * pOut,D3DXVECTOR3 * pOut,

CONST D3DXVECTOR3* pV1,CONST D3DXVECTOR3* pV1,

CONST D3DXVECTOR3* pV2);CONST D3DXVECTOR3* pV2);

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

2009-1 학기 컴퓨터게임 (DirectX) 31

행 렬행 렬 M x N M x N 행렬을 행렬을 mm 행과 행과 nn 열을 가지는 일반적인 열을 가지는 일반적인

배열배열 3 x 3 3 x 3 행렬 행렬 M, 2 x 4 M, 2 x 4 행렬 행렬 BB 를 본다를 본다 ..

M = M = B = B =

한 개의 행이나 열만을 가지는 행렬도 가능한 개의 행이나 열만을 가지는 행렬도 가능

• 이를 행 벡터이를 행 벡터 , , 열 벡터라고 부름열 벡터라고 부름

• V = V = U = U =

B11 B12 B13 B14B21 B22 B23 B24

M11 m12 m13M21 m22 m23M31 m32 m33

v11 V12 V13 V14

V11V12V13V14

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

2009-1 학기 컴퓨터게임 (DirectX) 32

상등 스칼라 곱상등 스칼라 곱 , , 더하기더하기

동일한 차원을 가지고 각각의 대응되는 항목이 동일한 차원을 가지고 각각의 대응되는 항목이 같은 두 개의 행렬을 같은 것으로 취급같은 두 개의 행렬을 같은 것으로 취급

• A = C, A A = C, A B, A B, A D D

행렬의 각 항목을 스칼라로 곱하는 방법으로 행렬의 각 항목을 스칼라로 곱하는 방법으로 행렬을 스칼라 곱할 수 있다행렬을 스칼라 곱할 수 있다 ..

kD = kD = K(1) k(2) k(-1) k(3)K(-6) k(3) k(0) k(0)

1 5-2 3

A = 6 25 -8

B = 1 5-2 3

C =1 2 -1 3-6 3 0 0

D =

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

2009-1 학기 컴퓨터게임 (DirectX) 33

행렬이 동일한 차원을 가진 경우에는 두 행렬을 행렬이 동일한 차원을 가진 경우에는 두 행렬을 더할 수 있다더할 수 있다 ..

A + B = A + B = = =

더하기와 마찬가지로 빼기도 같은 방법으로 수행더하기와 마찬가지로 빼기도 같은 방법으로 수행

1 5-2 3

6 25 -8

+1+6 5+2

-2+5 3+(-8)

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

2009-1 학기 컴퓨터게임 (DirectX) 34

곱곱 행렬 곱은 행렬 곱은 3D 3D 컴퓨터 그래픽에서 행렬을 컴퓨터 그래픽에서 행렬을

이용하기 위한 가장 중요한 연산이다이용하기 위한 가장 중요한 연산이다 ..

행렬 곱은 벡터의 변환을 수행하거나 몇 가지의 행렬 곱은 벡터의 변환을 수행하거나 몇 가지의 변환을 조합하는데 이용된다변환을 조합하는데 이용된다 ..

행렬 곱 행렬 곱 ABAB 를 얻기 위해서는 를 얻기 위해서는 AA 의 열 수와 의 열 수와 BB 이 이 행 수가 반드시 같아야 한다행 수가 반드시 같아야 한다 ..

2x3, 3x3 2x3, 3x3 차원을 가지는 차원을 가지는 AA 와 와 BB 의 두 행렬 곱의 의 두 행렬 곱의 예예

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

2009-1 학기 컴퓨터게임 (DirectX) 35

A = B = A = B =

곱셈 곱셈 ABAB 의 경우에는 의 경우에는 AA 의 열 수와 의 열 수와 BB 의 행 수가 의 행 수가 일치일치

• 곱셈 정의 가능곱셈 정의 가능• 하지만 하지만 BABA 곱은 불가능곱은 불가능 : B: B 의 열 수와 의 열 수와 AA 의 행 수가 일치 의 행 수가 일치

않음않음

AB =AB = = =

A11 A12 A13A21 A22 A23

B11 B12 B13B21 B22 B23B31 B32 B33

4 1-2 1

1 32 1

(4 1) • (1 2) (4 1) • (3 1)(-2 1) • (1 2) (-2 1) • (3 1)

a1• b1 a1• b2a2• b1 a2• b2

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

2009-1 학기 컴퓨터게임 (DirectX) 36

항 등 행 렬항 등 행 렬 (identity matrix)(identity matrix)

중심 대각선을 제외한 모든 항목이 중심 대각선을 제외한 모든 항목이 00 인 정방 행렬인 정방 행렬 중심 대각선의 항목들은 모두 중심 대각선의 항목들은 모두 11 2x2, 3x3, 4x4 2x2, 3x3, 4x4 항등행렬의 예항등행렬의 예

항등 행렬은 곱셈의 항등성을 가짐항등 행렬은 곱셈의 항등성을 가짐• MI = IM = MMI = IM = M

1 00 1

1 0 00 1 00 0 1

1 0 0 00 1 0 00 0 1 00 0 0 1

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

2009-1 학기 컴퓨터게임 (DirectX) 37

역 행 렬역 행 렬 행렬에는 나누기와 비교할 수 있는 연산 없으나 행렬에는 나누기와 비교할 수 있는 연산 없으나

곱하기와 반대의 의미를 가지는 역 연산이 존재 곱하기와 반대의 의미를 가지는 역 연산이 존재 정방 행렬만이 역행렬을 가질 수 있다정방 행렬만이 역행렬을 가질 수 있다 .. n x n n x n 행렬 행렬 MM 의 역행렬 의 역행렬 n x nn x n 은 은 MM-1-1 으로 표기으로 표기 모든 정방행렬이 역행렬을 가지지는 않는다모든 정방행렬이 역행렬을 가지지는 않는다 .. 행렬과 역행렬을 곱하면 항등 행렬을 얻는다행렬과 역행렬을 곱하면 항등 행렬을 얻는다 ..

• MM = M · MMM = M · M-1-1 = I = I

곱의 역에 대한 유용한 특성곱의 역에 대한 유용한 특성• (AB)(AB)-1-1 = B = B-1-1 A A-1-1 , A , A 와 와 BB 가 모두 역성이며 동일한 가 모두 역성이며 동일한

차원의 정방 행렬이라고 가정차원의 정방 행렬이라고 가정

-1

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

2009-1 학기 컴퓨터게임 (DirectX) 38

행렬의 전치행렬의 전치 (transpose)(transpose) 행렬의 열과 행을 교환하면 행렬의 전치를 수행행렬의 열과 행을 교환하면 행렬의 전치를 수행 mxn mxn 행렬의 전치는 행렬의 전치는 nxm nxm 행렬행렬 행렬 행렬 M M 의 전치는 의 전치는 MMTT 로 표시로 표시

A = B = A = B =

AATT = B = BT T = =

2 -1 83 6 -4

a, b, cd, e, fg, h, i

2 3-1 68 -4

a, d, gb, e, hc, f, i

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

2009-1 학기 컴퓨터게임 (DirectX) 39

D3DX D3DX 행렬행렬 Direct3D Direct3D 애플리케이션 프로그래밍 할 때는 애플리케이션 프로그래밍 할 때는 4 x 4 x

4 4 행렬과 행렬과 1 x 4 1 x 4 행 벡터만을 이용행 벡터만을 이용

벡터벡터 -- 행렬곱 행렬곱 v v 가 가 1 x 4 1 x 4 행렬이면행렬이면 , , 곱 곱 vTvT 가 가 정의정의 , , 결과는 결과는 1 x 4 1 x 4 행 벡터가 된다행 벡터가 된다 ..

행렬행렬 -- 행렬곱 행렬곱 TT 가 가 4 x 4 4 x 4 행렬이고 행렬이고 RR 이 이 4 x 4 4 x 4 행렬이라면행렬이라면 , , 곱 곱 TRTR 과 과 RTRT 가 모두 정의가 모두 정의 , , 두 가지 두 가지 모두 모두 4 x 44 x 4 행렬이 된다행렬이 된다 ..

• 행렬곱은 상호 교환적이지 않으므로 행렬곱은 상호 교환적이지 않으므로 TR TR 곱이 곱이 RTRT 와 와 같을 필요는 없다같을 필요는 없다 ..

D3DX D3DX 에서 벡터를 나타내기 위해 에서 벡터를 나타내기 위해 D3DXVECTOR3 D3DXVECTOR3 와 와 D3DXVECTOR4 D3DXVECTOR4 벡터 벡터 클래스 이용클래스 이용

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

2009-1 학기 컴퓨터게임 (DirectX) 40

D3DXMATRIX D3DXMATRIX 클래스클래스typedef struct D3DXMATRIX : public typedef struct D3DXMATRIX : public

D3DMATRIXD3DMATRIX

{{

public : public :

D3DXMATRIX() {};D3DXMATRIX() {};

D3DXMATRIX(CONST FLOAT*);D3DXMATRIX(CONST FLOAT*);

D3DXMATRIX(CONST D3DXMATRIX&);D3DXMATRIX(CONST D3DXMATRIX&);

D3DXMATRIX(FLOAT _11, FLOAT _12, FLOAT D3DXMATRIX(FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14, FLOAT _21, FLOAT _22, _13, FLOAT _14, FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24, FLOAT _31, FLOAT FLOAT _23, FLOAT _24, FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34,_32, FLOAT _33, FLOAT _34,

FLOAT _41, FLOAT _42, FLOAT _43, FLOAT FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44);_44);

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

2009-1 학기 컴퓨터게임 (DirectX) 41

// // 접근 허가접근 허가FLOAT & operator() (UINT Row, UINT Col);FLOAT & operator() (UINT Row, UINT Col);FLOAT & operator() (UINT Row, UINT Col) const;FLOAT & operator() (UINT Row, UINT Col) const;

// // 형 변환 연산자형 변환 연산자operator FLOAT* ();operator FLOAT* ();operator CONST FLOAT* () const;operator CONST FLOAT* () const;

// // 할당 연산자할당 연산자D3DXMATRIX& operator *= (CONST D3DXMATRIX&);D3DXMATRIX& operator *= (CONST D3DXMATRIX&);D3DXMATRIX& operator += (CONST D3DXMATRIX& operator += (CONST D3DXMATRIX&);D3DXMATRIX&);D3DXMATRIX& operator -= (CONST D3DXMATRIX&);D3DXMATRIX& operator -= (CONST D3DXMATRIX&);D3DXMATRIX& operator *= (FLOAT);D3DXMATRIX& operator *= (FLOAT);

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

2009-1 학기 컴퓨터게임 (DirectX) 42

D3DXMATRIX& operator /= (FLOAT);D3DXMATRIX& operator /= (FLOAT);

// // 단항 연산자단항 연산자D3DXMATRIX operator + () const;D3DXMATRIX operator + () const;

D3DXMATRIX operator - () const;D3DXMATRIX operator - () const;

// // 이항 연산자이항 연산자D3DXMATRIX operator * (CONST D3DXMATRIX&) const;D3DXMATRIX operator * (CONST D3DXMATRIX&) const;

D3DXMATRIX operator - (CONST D3DXMATRIX&) const;D3DXMATRIX operator - (CONST D3DXMATRIX&) const;

D3DXMATRIX operator + (CONST D3DXMATRIX&) const;D3DXMATRIX operator + (CONST D3DXMATRIX&) const;

D3DXMATRIX operator * (FLOAT) const;D3DXMATRIX operator * (FLOAT) const;

D3DXMATRIX operator / (FLOAT) const;D3DXMATRIX operator / (FLOAT) const;

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

2009-1 학기 컴퓨터게임 (DirectX) 43

friend D3DXMATIRX operator * (FLOAT, CONST friend D3DXMATIRX operator * (FLOAT, CONST D3DXMATRIX&);D3DXMATRIX&);

BOOL operator == (CONST D3DXMATRIX&);BOOL operator == (CONST D3DXMATRIX&);

BOOL operator != (CONST D3DXMATRIX&);BOOL operator != (CONST D3DXMATRIX&);

} D3DXMATRIX, *LPD3DXMATRIX;} D3DXMATRIX, *LPD3DXMATRIX;

D3DXMATRIX D3DXMATRIX 클래스는 다음과 같이 정의된 클래스는 다음과 같이 정의된 D3DMATRIX D3DMATRIX 구조체에서 데이터 항목을 상속구조체에서 데이터 항목을 상속

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

2009-1 학기 컴퓨터게임 (DirectX) 44

typedef struct _D3DMATRIX{typedef struct _D3DMATRIX{

union{union{

struct{struct{

float _11, _12, _13, _14;float _11, _12, _13, _14;

float _21, _22, _23, _24;float _21, _22, _23, _24;

float _31, _32, _33, _34;float _31, _32, _33, _34;

float _41, _42, _43, _44;float _41, _42, _43, _44;

};};

float m[4][4];float m[4][4];

};};

} D3DMATRIX;} D3DMATRIX;

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

2009-1 학기 컴퓨터게임 (DirectX) 45

D3DXMATRIX D3DXMATRIX 클래스클래스

• 행렬의 동일함 확인행렬의 동일함 확인• 더하기더하기 , , 빼기빼기 , , 스칼라로 행렬 곱하기스칼라로 행렬 곱하기 , , 형 변환형 변환• 두 개의 두 개의 D3DXMATRIXD3DXMATRIX 를 곱하는 등의 유용한 를 곱하는 등의 유용한

연산자들을 다수 포함연산자들을 다수 포함

D3DX D3DX 라이브러리는 이외에도 항등행렬 지정라이브러리는 이외에도 항등행렬 지정 , , 전치전치 , , 역행렬 찾는 유용한 함수 포함역행렬 찾는 유용한 함수 포함 ..

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

2009-1 학기 컴퓨터게임 (DirectX) 46

D3DXMATRIX * D3DXMatrixIdentity(D3DXMATRIX *pout);D3DXMATRIX * D3DXMatrixIdentity(D3DXMATRIX *pout);

D3DXMATRIX M;D3DXMATRIX M;D3DXMatrixIdentity(&M); // D3DXMatrixIdentity(&M); // 항등행렬 지정항등행렬 지정

D3DXMATRIX *D3DXMatrixtranspose(D3DXMATRIX *pout, D3DXMATRIX *D3DXMatrixtranspose(D3DXMATRIX *pout, CONST D3DXMATRIX *pM);CONST D3DXMATRIX *pM);

D3DXMATRIX A(D3DXMATRIX A(……););D3DXMATRIX B;D3DXMATRIX B;D3DXMatrixTranspose(&B, &A);D3DXMatrixTranspose(&B, &A);

D3DXMATRIX *D3DXMatrixInverse( D3DXMATRIX *pOut,D3DXMATRIX *D3DXMatrixInverse( D3DXMATRIX *pOut,FLOAT *pDeterminant, CONST D3DXMATRIX *pM);FLOAT *pDeterminant, CONST D3DXMATRIX *pM);

// pM// pM 의 역행렬 리턴의 역행렬 리턴 , , 다음 인자는 행렬식다음 인자는 행렬식 , , 다음다음 , , 뒤집을 행렬뒤집을 행렬

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

2009-1 학기 컴퓨터게임 (DirectX) 47

D3DXMATRIX A(D3DXMATRIX A(……););

D3DXMATRIX B;D3DXMATRIX B;

D3DXMatrixinverse(&B, 0, &A); // B = inverse(A);D3DXMatrixinverse(&B, 0, &A); // B = inverse(A);

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

2009-1 학기 컴퓨터게임 (DirectX) 48

기본적인 변환기본적인 변환• Direct3D Direct3D 에서는 변환을 표현 위해 에서는 변환을 표현 위해 4x4 4x4 행렬 이용행렬 이용• 행렬의 행렬의 44 번째 인자번째 인자 (w)(w) 의 성분의 성분

1 x 4 1 x 4 벡터에 포인트를 배치할 때에는 벡터에 포인트를 배치할 때에는 W = 1W = 1

• 반면에 벡터는 위치를 가지지 않으므로 벡터의 이동은 정의될 수 반면에 벡터는 위치를 가지지 않으므로 벡터의 이동은 정의될 수 없음없음

W = 0 W = 0 으로 표기되어야 함으로 표기되어야 함 ..

• 포인트 이동이 바르게 처리되기 위해서는 포인트 이동이 바르게 처리되기 위해서는 w = 1w = 1

• 벡터 이동을 막기 위해서는벡터 이동을 막기 위해서는 w = 0 w = 0 을 지정해야 함을 지정해야 함

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

2009-1 학기 컴퓨터게임 (DirectX) 49

이동 행렬이동 행렬

(x,y,z,1) (x,y,z,1) 벡터를 다음과 같은 행렬로 곱하면 벡터를 다음과 같은 행렬로 곱하면 x,y,zx,y,z 로 로 px, py, pzpx, py, pz 만큼 이동할 수 있다만큼 이동할 수 있다 ..

• T(p) = T(p) =

이 동

1 0 0 00 1 0 00 0 1 0px py pz 1

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

2009-1 학기 컴퓨터게임 (DirectX) 50

• 이동 행렬이동 행렬

D3DXMATRIX* D3DXMatrixTranslation(D3DXMATRIX* D3DXMatrixTranslation(

D3DXMATRIX* pOut,D3DXMATRIX* pOut,

FLOAT x, // x FLOAT x, // x 축으로 이동할 단위의 수축으로 이동할 단위의 수FLOAT y, // y FLOAT y, // y 축으로 이동할 단위의 수축으로 이동할 단위의 수FLOAT z // z FLOAT z // z 축으로 이동할 단위의 수축으로 이동할 단위의 수

););

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

2009-1 학기 컴퓨터게임 (DirectX) 51

이동 벡터 이동 벡터 pp 의 부호를 바꾸는 것은 이동행렬의 의 부호를 바꾸는 것은 이동행렬의 역행렬로 구함역행렬로 구함

T = T(-p) = T = T(-p) =

•회 전 행 렬회 전 행 렬

1 0 0 00 1 0 00 0 1 0-px -py -pz 1

-1

회 전

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

2009-1 학기 컴퓨터게임 (DirectX) 52

회전 행렬회전 행렬D3DXMATRIX* D3DXMatrixRotationX(D3DXMATRIX* D3DXMatrixRotationX(

D3DXMATRIX* pOut, // D3DXMATRIX* pOut, // 결과결과FLOAT Angle); // FLOAT Angle); // 라디안으로 측정한 회전각라디안으로 측정한 회전각

D3DXMATRIX* D3DXMatrixRotationY(D3DXMATRIX* D3DXMatrixRotationY(

D3DXMATRIX* pOut, // D3DXMATRIX* pOut, // 결과결과FLOAT Angle); // FLOAT Angle); // 라디안으로 측정한 회전각라디안으로 측정한 회전각

D3DXMATRIX* D3DXMatrixRotationZ(D3DXMATRIX* D3DXMatrixRotationZ(

D3DXMATRIX* pOut, // D3DXMATRIX* pOut, // 결과결과FLOAT Angle); // FLOAT Angle); // 라디안으로 측정한 회전각라디안으로 측정한 회전각

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

2009-1 학기 컴퓨터게임 (DirectX) 53

모든 축으로 회전 가능모든 축으로 회전 가능 (( 라디안값 사용라디안값 사용 ))

X(X() =

Y() =

Z() =

1 0 0 00 cos sin 00 -sin cos 00 0 0 1

cos 0 -sin 00 1 0 0sin 0 cos 00 0 0 1

cos sin 0 0-sin cos 0 00 0 1 00 0 0 1

D3DXMATRIX *D3DXMatrixRotationX(

D3DXMATRIX* pOut,

FLOAT Angle);

D3DXMATRIX *D3DXMatrixRotationY(

D3DXMATRIX* pOut,

FLOAT Angle);

D3DXMATRIX *D3DXMatrixRotationZ(

D3DXMATRIX* pOut,

FLOAT Angle);

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

2009-1 학기 컴퓨터게임 (DirectX) 54

크기 변환 행렬크기 변환 행렬

S(q) = S(q) =

크기 변형

qx 0 0 00 qy 0 00 0 qz 00 0 0 1

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

2009-1 학기 컴퓨터게임 (DirectX) 55

D3DXMATRIX *DeDXMatrixScaling(D3DXMATRIX *DeDXMatrixScaling(

D3DXMATRIX* pOut;D3DXMATRIX* pOut;

FLOAT sx, // xFLOAT sx, // x 축 크기 변형 단위축 크기 변형 단위FLOAT sy,FLOAT sy, // y // y 축 크기 변형 단위축 크기 변형 단위FLOAT sz ); // zFLOAT sz ); // z 축 크기 변형 단위축 크기 변형 단위

크기 변형 행렬의 역은 각 크기인자의 역으로 구함크기 변형 행렬의 역은 각 크기인자의 역으로 구함

S = S( ) = S = S( ) =

a, b, c a, b, c 는 각각 위의 크기인자 역는 각각 위의 크기인자 역

1 1 1

qx , qy , qz

a 0 0 00 b 0 00 0 c 00 0 0 1

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

2009-1 학기 컴퓨터게임 (DirectX) 56

변환 조합하기변환 조합하기 하나의 벡터에 일련의 변환을 적용해야 하는 하나의 벡터에 일련의 변환을 적용해야 하는

경우가 많다경우가 많다 ..

• 벡터의 배율을 변경하고 회전한 다음 이동벡터의 배율을 변경하고 회전한 다음 이동 ..

벡터 벡터 p = [5,0,0,1]p = [5,0,0,1] 을 모든 축으로 을 모든 축으로 1/5 1/5 크기로 크기로 배율 변경배율 변경 , y, y 축으로 ∏ 축으로 ∏ /4 /4 라디안 만큼 회전라디안 만큼 회전 , , x x 축으로 축으로 11 단위단위 , y, y 축으로축으로 22 단위 단위 ,z ,z 축으로 축으로 33단위 만큼 이동하라단위 만큼 이동하라

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

2009-1 학기 컴퓨터게임 (DirectX) 57

크기변형크기변형 , , 회전회전 , , 이동을 수행해야 함이동을 수행해야 함

크기크기 , , 회전회전 , , 이동 행렬을 이동 행렬을 (S,Ry,T)(S,Ry,T) 를 구성하자를 구성하자 ..

S(- - -) = S(- - -) =

a, b, ca, b, c

Ry( - ) =Ry( - ) =

1 1 1

5 , 5 , 5

a 0 0 00 b 0 00 0 c 00 0 0 1

∏∏ 4

0.707 0 -0.707 00 1 0 00.707 0 -0.707 00 0 0 1

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

2009-1 학기 컴퓨터게임 (DirectX) 58

T(1, 2, -3) = T(1, 2, -3) =

크기 변형과 회전크기 변형과 회전 , , 이동을 위한 변환 순서를 이동을 위한 변환 순서를 차례로 적용하면 다음과 같은 결과 얻는다차례로 적용하면 다음과 같은 결과 얻는다 ..

ps = [1,0,0,1] = pps = [1,0,0,1] = p’’ pp’’Ry = [.707 0, 0.707 1] = pRy = [.707 0, 0.707 1] = p’’’’ pp’’’’T = [1.707 , 2, -3.707, 1]T = [1.707 , 2, -3.707, 1]

1 0 0 00 1 0 00 0 1 01 2 -3 1

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

2009-1 학기 컴퓨터게임 (DirectX) 59

행렬의 한 가지 중요한 이점은 행렬 곱을 이용하여 행렬의 한 가지 중요한 이점은 행렬 곱을 이용하여 몇가지의 변환을 하나의 행렬로 결합 가능몇가지의 변환을 하나의 행렬로 결합 가능

여기에서 변환을 위해 곱한 순서는 최종적으로 여기에서 변환을 위해 곱한 순서는 최종적으로 적용되는 변환의 순서가 된다적용되는 변환의 순서가 된다 ..

SRyT = SRyT =

== = Q= Q

a 0 0 00 b 0 00 0 c 00 0 0 1

0.707 0 -0.707 00 1 0 00.707 0 -0.707 00 0 0 1

1 0 0 00 1 0 00 0 1 0

1 2 -3 1

0.1414 0 -0.1414 00 1 0 00.1414 0 -0.1414 01 2 -3 1

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

2009-1 학기 컴퓨터게임 (DirectX) 60

결국 결국 pQ = [1.707, 2, -3.707, 1] pQ = [1.707, 2, -3.707, 1] 이 된다이 된다 ..

여러 개의 변환을 하나의 변환으로 결합하는 여러 개의 변환을 하나의 변환으로 결합하는 능력은 성능에 큰 영향을 준다능력은 성능에 큰 영향을 준다 ..

• 연산을 획기적으로 줄임연산을 획기적으로 줄임

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

2009-1 학기 컴퓨터게임 (DirectX) 61

벡터 변환을 위한 몇 가지 함수들벡터 변환을 위한 몇 가지 함수들 D3DX D3DX 라이브러리는 포인트와 벡터 변환을 위한 라이브러리는 포인트와 벡터 변환을 위한

두 개의 함수를 제공두 개의 함수를 제공

D3DXVec3TransformCoordD3DXVec3TransformCoord• 포인트 변환포인트 변환 , , 벡터의 네번째 성분이 벡터의 네번째 성분이 11 로 인식된다고 로 인식된다고

가정가정

D3DVec3TransformNormalD3DVec3TransformNormal• 벡터를 변환벡터를 변환 , , 벡터의 네번째 성분이 벡터의 네번째 성분이 00 이라고 인식이라고 인식

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

2009-1 학기 컴퓨터게임 (DirectX) 62

D3DXVECTOR3 * D3DVec3TransformCoord{D3DXVECTOR3 * D3DVec3TransformCoord{

D3DXVECTOR3* pOut; CONST D3DXVECTOR3* pV,D3DXVECTOR3* pOut; CONST D3DXVECTOR3* pV,

CONST D3DXMATRIX *pM };CONST D3DXMATRIX *pM };

D3DXMATRIX T(D3DXMATRIX T(……););

D3DXVECTOR3 p(D3DXVECTOR3 p(……););

D3DXVec3TransformCoord(&p, &p, &T);D3DXVec3TransformCoord(&p, &p, &T);

D3DXVECTOR3 *WINAPI D3DXVec3TransformNormal(D3DXVECTOR3 *WINAPI D3DXVec3TransformNormal(

D3DXVECTOR3 *pOut; CONST D3DXVECTOR3 *pV,D3DXVECTOR3 *pOut; CONST D3DXVECTOR3 *pV,

CONST D3DXMATRIX *pM }; // CONST D3DXMATRIX *pM }; // 결과결과 , , 변환할 벡터변환할 벡터 , , 행렬행렬D3DXMATRIX T(D3DXMATRIX T(……););

D3DXMATRIX v(D3DXMATRIX v(……););

D3DXVec3TransformCoord(&v, &v , &T);D3DXVec3TransformCoord(&v, &v , &T);

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

2009-1 학기 컴퓨터게임 (DirectX) 63

평면평면 하나의 벡터 하나의 벡터 nn 과 평면 상의 포인트 과 평면 상의 포인트 p0p0 로 표현로 표현

벡터 벡터 nn 은 평면의 법선 벡터라고 부르며 평면과 은 평면의 법선 벡터라고 부르며 평면과 수직을 이룬다수직을 이룬다 ..

n

p0

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

2009-1 학기 컴퓨터게임 (DirectX) 64

다음은 포인트 다음은 포인트 pp 가 방정식을 만족시키고 있음을 가 방정식을 만족시키고 있음을 보여준다보여준다 ..

N N •• (p (p –– p p00) = 0 ) = 0

p

PP0

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

2009-1 학기 컴퓨터게임 (DirectX) 65

특정 평면을 표현하는 데 있어 법선특정 평면을 표현하는 데 있어 법선 nn 과 평면 상의 과 평면 상의 알려진 포인트 알려진 포인트 p0p0 은 고정된다은 고정된다 ..

따라서 위의 식을 다음과 같이 작성하는 것이 따라서 위의 식을 다음과 같이 작성하는 것이 일반적이다일반적이다 ..

n n •• p + d = 0 p + d = 0

평면의 법선을 벡터 평면의 법선을 벡터 nn 이 단위 길이일 경우이 단위 길이일 경우 , ,

• d = -nd = -n•• p0 p0 으로 원점에서 평면까지의 부호를 가진 가장 으로 원점에서 평면까지의 부호를 가진 가장 짧은 거리를 얻을 수 있다짧은 거리를 얻을 수 있다 ..

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

2009-1 학기 컴퓨터게임 (DirectX) 66

• D3DXPLANED3DXPLANE

코드에서 평면을 표현할 때는 법선 벡터 코드에서 평면을 표현할 때는 법선 벡터 nn 과 과 상수 상수 dd 를 보관하는 것으로 충분하다를 보관하는 것으로 충분하다 ..

D3DX D3DX 라이브러리는 다음과 같은 구조체를 라이브러리는 다음과 같은 구조체를 평면으로 표현평면으로 표현

typedef struct D3DXPLANEtypedef struct D3DXPLANE{{ # ifdef __cplusplus# ifdef __cplusplus public :public :

D3DXPLANE() {}D3DXPLANE() {}D3DXPLANE(CONST FLOAT *);D3DXPLANE(CONST FLOAT *);

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

2009-1 학기 컴퓨터게임 (DirectX) 67

D3DXPLANE(CONST D3DXPLOAT16 *);D3DXPLANE(CONST D3DXPLOAT16 *);

D3DXPLNAE(FLOAT a, FLOAT b, FLOAT c, FLOAT d);D3DXPLNAE(FLOAT a, FLOAT b, FLOAT c, FLOAT d);

// // 형변환형변환 operator FLOAT*();operator FLOAT*();

operator CONST FLOAT * () const;operator CONST FLOAT * () const;

// // 단항연산자단항연산자 D3DXPLANE operator +() const;D3DXPLANE operator +() const;

D3DXPLANE operator D3DXPLANE operator ––() const;() const;

//// 이항 연산자이항 연산자BOOL operator == (CONST D3DXPLANE&) const;BOOL operator == (CONST D3DXPLANE&) const;

BOOL operator != (CONST D3DXPLANE&) const;BOOL operator != (CONST D3DXPLANE&) const;

#endif #endif

FLOAT a, b, c, d; // a, b, cFLOAT a, b, c, d; // a, b, c 는 평면의 법선벡터 는 평면의 법선벡터 nn 의 성분의 성분 , d, d 는 상수는 상수}D3DXPLANE, *LPD3DXPLANE;}D3DXPLANE, *LPD3DXPLANE;

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

2009-1 학기 컴퓨터게임 (DirectX) 68

포인트와 평면 공간의 관계포인트와 평면 공간의 관계 평면에서 포인트의 상대적 위치를 테스트 하는데 평면에서 포인트의 상대적 위치를 테스트 하는데

매우 유용하다매우 유용하다 ..• nn•• p + d = 0; p + d = 0;

n n •• p + d = 0 p + d = 0 이면 평면에 있다이면 평면에 있다 ..

n n •• p + d > 0 p + d > 0 이면 평면의 앞쪽 양의 절반 공간이면 평면의 앞쪽 양의 절반 공간

n n •• p + d < 0 p + d < 0 이면 평면의 뒤쪽 음의 절반 공간이면 평면의 뒤쪽 음의 절반 공간

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

2009-1 학기 컴퓨터게임 (DirectX) 69

만약 평면의 법선 벡터 만약 평면의 법선 벡터 nn 이 단위 길이라면이 단위 길이라면 , ,

nn•• p + d p + d 로 평면에서 포인트 로 평면에서 포인트 pp 까지의 부호를 까지의 부호를 가진 가장 짧은 거리를 얻을 수 있다가진 가장 짧은 거리를 얻을 수 있다 ..

다음의 함수는 특정 평면과 포인트를 위한 다음의 함수는 특정 평면과 포인트를 위한 nn•• p+d p+d를 계산한다를 계산한다 ..

FLOAT D3DXPlaneDotCoord(FLOAT D3DXPlaneDotCoord(

CONST D3DXPLANE *pP,CONST D3DXPLANE *pP,

CONST D3DXVECOTR *pVCONST D3DXVECOTR *pV

););

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

2009-1 학기 컴퓨터게임 (DirectX) 70

// // 평면에 상대적인 포인트 위치를 테스트평면에 상대적인 포인트 위치를 테스트

D3DXPLANE p(0.0f, 1.0f, 0.0f, 0.0f);D3DXPLANE p(0.0f, 1.0f, 0.0f, 0.0f);

D3DXVECTOR3 v(3.0f, 5.0f, 2.0f);D3DXVECTOR3 v(3.0f, 5.0f, 2.0f);

Float x = D3DXPlaneDotCoord(&p, &v);Float x = D3DXPlaneDotCoord(&p, &v);

If(x approximately equals 0.0f) // vIf(x approximately equals 0.0f) // v 는 평면과 공면는 평면과 공면If(x > 0) // vIf(x > 0) // v 는 양의 절반 공간는 양의 절반 공간If(x < 0) // vIf(x < 0) // v 는 음의 절반 공간는 음의 절반 공간

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

2009-1 학기 컴퓨터게임 (DirectX) 71

부동 소수점의 부정확성으로 인해 부동 소수점의 부정확성으로 인해 ““대략적으로 대략적으로 같은같은””의 개념을 이용의 개념을 이용

D3DXPlaneDotCoordD3DXPlaneDotCoord 와 비슷한 메서드로는 와 비슷한 메서드로는 D3DXPlaneDotD3DXPlaneDot 와 와 D3DXPlaneDotNormalD3DXPlaneDotNormal 이 이 있다있다 ..

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

2009-1 학기 컴퓨터게임 (DirectX) 72

평면 구축평면 구축• 법선과 평면의 부호 거리를 곧바로 지정하는 방법 법선과 평면의 부호 거리를 곧바로 지정하는 방법

이외에도 이를 계산하는 두 가지 방법이 있다이외에도 이를 계산하는 두 가지 방법이 있다 .. n n •• p0 + d = 0 p0 + d = 0 n n •• p0 = -d p0 = -d -n -n •• p0 = d p0 = d

D3DX D3DX 라이브러리는 이 계산을 위한 함수 제공라이브러리는 이 계산을 위한 함수 제공

D3DXPLANE * D3DXPlaneFromPointNormal(D3DXPLANE * D3DXPlaneFromPointNormal(

D3DXPLANE* pOut,D3DXPLANE* pOut,

CONST D3DXVECTOR3* pPoint,CONST D3DXVECTOR3* pPoint,

CONST D3DXVECTOR3* pNormal);CONST D3DXVECTOR3* pNormal);

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

2009-1 학기 컴퓨터게임 (DirectX) 73

• 평면을 구축하는 두 번째 방법은 평면 상의 세 평면을 구축하는 두 번째 방법은 평면 상의 세 개의 포인트를 지정하는 것이다개의 포인트를 지정하는 것이다 ..

p0, p1, p2 p0, p1, p2 포인트가 있다면포인트가 있다면 , , 평면상의 두 개의 평면상의 두 개의 벡터를 구성할 수 있다벡터를 구성할 수 있다 ..

u = p1 u = p1 –– p0 p0 v = p2 v = p2 –– p0 p0

이제 평면상에 있는 두 벡터의 외적을 얻으면 이제 평면상에 있는 두 벡터의 외적을 얻으면 법선이 계산된다법선이 계산된다 ..

• n = u n = u x v

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

2009-1 학기 컴퓨터게임 (DirectX) 74

D3DX D3DX 라이브러리는 평면상의 세 개의 라이브러리는 평면상의 세 개의 포인트를 이용해 평면을 계산하는 다음과 포인트를 이용해 평면을 계산하는 다음과 같은 함수 제공같은 함수 제공

D3DXPLANE *D3DXPlaneFromPoints(D3DXPLANE *D3DXPlaneFromPoints(D3DXPLANE* pOut,D3DXPLANE* pOut, // // 결과결과CONST D3DXVECTOR3* pV1, // CONST D3DXVECTOR3* pV1, // 평면상의 평면상의

포인트포인트 11CONST D3DXVECTOR3* pV2, // CONST D3DXVECTOR3* pV2, // 평면상의 평면상의

포인트포인트 22CONST D3DXVECTOR3* pV3 // CONST D3DXVECTOR3* pV3 // 평면상의 평면상의

포인트포인트 33););

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

2009-1 학기 컴퓨터게임 (DirectX) 75

평면 정규화평면 정규화 n n •• p + d = 0 p + d = 0 와 와 d = -n d = -n •• p0 p0 법선 벡터의 길이가 상수 법선 벡터의 길이가 상수 dd 에 영향을 주기 때문에 에 영향을 주기 때문에

법선 벡터를 정규화 하면 법선 벡터를 정규화 하면 d d 역시 다시 계산해야 함역시 다시 계산해야 함

- (n, d) = ( - , - )- (n, d) = ( - , - )

다음은 평면 법선 벡터를 정규화 하기 위해 다음은 평면 법선 벡터를 정규화 하기 위해 사용되는 사용되는 D3DX D3DX 함수이다함수이다 ..

D3DXPLANE *D3DXPlaneNormalize(D3DXPLANE *D3DXPlaneNormalize(

D3DXPLANE *pOut, // D3DXPLANE *pOut, // 정규화된 결과 평면정규화된 결과 평면CONST D3DXPLANE *pP // CONST D3DXPLANE *pP // 입력 평면입력 평면

););

n

|n|

d

|n|

1

|n|

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

2009-1 학기 컴퓨터게임 (DirectX) 76

평면 변환평면 변환 평면평면 (n, d)(n, d) 를 를 4D 4D 벡터로 취급하고 원하는 변환 벡터로 취급하고 원하는 변환

행렬의 역행렬의 역 -- 전치와 곱함으로써 평면을 변환 가능전치와 곱함으로써 평면을 변환 가능

D3DX D3DX 함수가 사용된다함수가 사용된다 ..

D3DXPLANE* D3DXPlaneTransform(D3DXPLANE* D3DXPlaneTransform(

D3DXPLANE *pOut,D3DXPLANE *pOut, // // 결과결과CONST D3DXPLANE *pP, // CONST D3DXPLANE *pP, // 입력 평면입력 평면

CONST D3DXMATRIX *pM ); // CONST D3DXMATRIX *pM ); // 변환 행렬변환 행렬););

^

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

2009-1 학기 컴퓨터게임 (DirectX) 77

평면에서 특정 포인트와 가장 가까운 포인트평면에서 특정 포인트와 가장 가까운 포인트

공간에 하나의 포인트 공간에 하나의 포인트 pp 를 가지고 있고 를 가지고 있고 pp 와 가장 와 가장 가까운 평면가까운 평면 (n, d) (n, d) 상의 포인트 상의 포인트 qq 를 찾으려 를 찾으려 한다고 가정해 보자한다고 가정해 보자 ..

여기에서는 평면의 법선 벡터가 단위 길이라고 여기에서는 평면의 법선 벡터가 단위 길이라고 가정함가정함

^

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

2009-1 학기 컴퓨터게임 (DirectX) 78

q = p + (-kn) q = p + (-kn) 이며 이며 , k, k 는 는 pp 에서 평면으로의 에서 평면으로의 부호가 있는 가장 잛은 거리 부호가 있는 가장 잛은 거리

포인트 포인트 pp 와 와 qq 사이의 가장 짧은 부호가 있는 거리사이의 가장 짧은 부호가 있는 거리

x

(n, d)Y

n

kn

q

-kn

p

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

2009-1 학기 컴퓨터게임 (DirectX) 79

광 선광 선 게임에서 총을 쏘는 기능을 만들 때게임에서 총을 쏘는 기능을 만들 때

특정 위치에서 어떤 방향으로 발사된 총알이 특정 위치에서 어떤 방향으로 발사된 총알이 타겟에 맞았는지를 확인하는 방법타겟에 맞았는지를 확인하는 방법

• 광선으로 총알을 모델링하고 적을 경계 구체로 모델링 광선으로 총알을 모델링하고 적을 경계 구체로 모델링 하는 것하는 것

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

2009-1 학기 컴퓨터게임 (DirectX) 80

• 광 선광 선 관점과 방향을 이용하면 광선을 표시할 수 있다관점과 방향을 이용하면 광선을 표시할 수 있다 ..

p(t) = p0 + tup(t) = p0 + tu

P0 P0+UP0+2U

P0 + 3U

U

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

2009-1 학기 컴퓨터게임 (DirectX) 81

P0P0 는 광선의 원점이며 는 광선의 원점이며 uu 는 광선의 방향이고 는 광선의 방향이고 TT 는 는 매개 변수이다매개 변수이다 . .

tt 에 다른 값을 넣으면 광선 상의 다른 포인트를 에 다른 값을 넣으면 광선 상의 다른 포인트를 계산 가능계산 가능

매개변수 매개변수 tt 는 반드시 는 반드시 [0, ∞ )[0, ∞ )범위여야 함범위여야 함

• 00 보다 작은 값을 이용하면 광선 뒤쪽에 포인트 만들어짐보다 작은 값을 이용하면 광선 뒤쪽에 포인트 만들어짐

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

2009-1 학기 컴퓨터게임 (DirectX) 82

광선광선 //평면 교차평면 교차 광선 광선 p(t) = p0 + tup(t) = p0 + tu 와 평면 와 평면 n n •• p +d =0 p +d =0 이 이

있다고 할 때있다고 할 때

교차하는지를 알기 위해서는 평면 방정식에 광선을 교차하는지를 알기 위해서는 평면 방정식에 광선을 넣고 넣고

방정식을 만족시키는 매개 변수 방정식을 만족시키는 매개 변수 tt 를 풀어내면 됨를 풀어내면 됨

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

2009-1 학기 컴퓨터게임 (DirectX) 83

n n •• p(t) + d = 0 p(t) + d = 0

nn•• (p0+tu) + d = 0 (p0+tu) + d = 0

nn•• p0 +n p0 +n•• tu + d = 0 tu + d = 0

nn•• tu = -d - (n tu = -d - (n •• p0) p0)

t(nt(n•• u) = -d - (n u) = -d - (n •• p0) p0)

t =t =-d - (n • p0)

(n • u)

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

2009-1 학기 컴퓨터게임 (DirectX) 84

만약 만약 tt 가 범위 가 범위 [0, ∞) [0, ∞) 내에 있지 않으면내에 있지 않으면 , , 평면과 평면과 교차 하지 않는다교차 하지 않는다 ..

범위 내에 있다면 범위 내에 있다면

• 평면 방정식을 만족시키는 매개 변수를 광선 방정식에 평면 방정식을 만족시키는 매개 변수를 광선 방정식에 넣고 교차점을 얻을 수 있다넣고 교차점을 얻을 수 있다 ..

p( ) = p0 + up( ) = p0 + u-d - (n • p0)

(n • u)

-d - (n • p0)

(n • u)