DirectX9 프로그래밍의기초 2
목 차 파일포맷 ID3DXBuffer 사용하기 경계볼륨 애니메이션및게임실습 2
3D Modeler 3DS Max LightWave 3D Maya 메쉬데이터 기하정보 재질 애니메이션 애니메이션및게임실습 3
.X DirectX 에서사용하는파일포맷 파일처리함수를 DirectX 가제공 파일종류 ASCII Binary Binary Compressed 애니메이션및게임실습 4
파일포맷 사용자정의데이터형 X 파일은사용자에의해정의된템플릿에의해동작 템플릿은데이터개체가어떻게저장되어야하는지를정의 계층적관계 선택적멤버 : 템플릿이허용하는데이터타입들. 선택적멤버들은데이터개체의자식멤버로저장됨 자식멤버 : 다른데이터개체, 다른개체의참조, 이진데이터 애니메이션및게임실습 5
square.x 애니메이션및게임실습 6
헤더 xof 0303txt 0032 파일의시작 : xof 버전 : 03.03 파일포맷 : txt, bin, tzip, bzip 부동소수점데이터타입 : 0032, 0064 애니메이션및게임실습 7
메시 Mesh Square { 정점의수정점정보면의수면정보메시재질리스트 } Mesh Square { 8; // 정점의수 1.0; 1.0; 0.0;, // vertice 0-1.0; 1.0; 0.0;, // vertice 1-1.0;-1.0; 0.0;, // vertice 2 10 1.0;-1.0; 10 00 0.0; // vertice 3 1.0; 1.0; 0.0;, // vertice 4 1.0;-1.0; 0.0;, // vertice 5-1.0;-1.0; ; 0.0;, // vertice 6-1.0; 1.0; 0.0;; // vertice 7 4; // 면의수 3;0,1,2;, // triangle #1 3023 3;0,2,3;, //ti triangle #2 3;4,5,6;, // triangle #3 3;4,6,7;; // triangle #4 } 애니메이션및게임실습 8
메시재질리스트 MeshMaterialList 는매시개체의자식개체로서메시개체의일부로동작 재질의개수, 면의개수, 재질 MeshMaterialList { 1; // one material 4; // one face 0, // face #0 use material #0 0, // face #1 use material #0 0, // face #2 use material #0 0;; // face #3 use material #0 } 애니메이션및게임실습 9
재질 재질의색, 힘, 반사광색상, 발광색상 Material { // material #0 00;10;05;10;; 0.0;1.0;0.5;1.0;; // face color 0.0; // power 0.0;0.0;0.0;; // specular color 0.0;0.0;0.0;; // emissive color } 애니메이션및게임실습 10
square2.x 애니메이션및게임실습 11
VertexDuplicationIndices 메시한개당하나씩생성 메시내의어떤정점들이중복되는지에대한정보 매끄러운부분혹은재질경계에서발생 메시단순화프로그램에서사용 애니메이션및게임실습 12
법선벡터 MeshNormals { 8; 0.000000;0.000000;1.000000;, 0.000000;0.000000;1.000000;, 0.000000;0.000000;1.000000;, 0.000000;0.000000;1.000000;, 0.000000;0.000000;-1.000000;, 0.000000;0.000000;-1.000000;, 0.000000;0.000000;-1.000000;, 000000;0 000000;-1 000000; 0.000000;0.000000;-1.000000;; 4; 3;0,1,2;, 3;0,2,3;, 3;4,5,6;, 3;4,6,7;; } 애니메이션및게임실습 13
텍스처 Material 개체의멤버로 TextureFilename 개체생성 Material GreenMat { 0.0;1.0;0.0;1.0;; 0.0; 0.0;0.0;0.0;; 0.0;0.0;0.0;; } TextureFilename { "wall.bmp"; } 애니메이션및게임실습 14
텍스처좌표매핑 MeshTextureCoords { MeshTextureCoords { 8; // 4 texture coords 4; 1.0; 1.0;, // coord 0 1.0; 0.0;, // coord 1 0.0; 0.0;, // coord 2 0.0; 1.0;; // coord 3 1.0; 1.0;, // coord 0 1.0; 0.0;, // coord 1 0.0; 0.0;, // coord 2 0.0; 1.0;; // coord 3 1.0; 1.0;, // coords 4 } } 1.0;-1.0;, 1.0;, // coords 5-1.0;-1.0;, // coords 6-1.0; 1.0;; // coords 7 MeshTextureCoords { 4; 1.0; 1.0;, // coord 0-1.0; 0.0;, // coord 1-1.0; -1.0;, // coord 2 1.0; -1.0;; // coord 3 } 애니메이션및게임실습 15
square3.x 애니메이션및게임실습 16
boidy.x 애니메이션및게임실습 17
boidy.x 애니메이션및게임실습 18
변환행렬 프레임 : 물체의각부분을별개로움직이게하려면모델을여러개의프레임으로구분 전차 : 포 상하좌우, 바퀴, 궤도 Frame SQUARE_Root { FrameTransformMatrix { 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000;; } } 애니메이션및게임실습 19
AnimationSet Positionkey 0:scaling 1 : rotation 2 : translation 4 : matrix 애니메이션및게임실습 20
AnimationSet AnimationSetMoveX{ Animation{ AnimationKey{ 4;//Positionkeys 5;//5keys 0;16;10000000 0;16;1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.1,0.0,0.0,1.0;;,,, 80;16;1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 02000010;; 0.2,0.0,0.0,1.0;;, 애니메이션및게임실습 21
AnimationSet } } 160;16;1.0,0.0,0.0,0.0, 00100000 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.3,0.0,0.0,1.0;;, 240;16;1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.2,0.0,0.0,1.0;;, 320;16;1.0,0.0,0.0,0.0, 0 000000 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.1,0.0,0.0,1.0;;, } {SQUARE_Root} 애니메이션및게임실습 22
square4.x 애니메이션및게임실습 23
ID3DXBuffer 연속적인메모리블록에데이터를저장하기위해이용하는범용데이터구조체 LPVOID GetBufferPointer() : 데이터의시작포인터 DWORD GetBufferSize() : 버퍼크기 데이터형변환 DWORD* info = (DWORD*)adjacencyInfo->GetBufferPointer(); () D3DXMATERIAL* mtrl = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer(); adjacencyinfo->release(); mtrlbuffer->release(); 애니메이션및게임실습 24
ID3DXBuffer HRESULT D3DXCreateBuffer ( DWORD NumBytes, LPD3DXBUFFER *ppbuffer ); // 버퍼의크기 // 생성된버퍼 ID3DXBuffer* buffer = 0; D3DXCreateBuffer(4*sizeof(int), &buffer); 애니메이션및게임실습 25
Load HRESULT D3DXLoadMeshFromX ( LPCSTR pfilename, // 명 DWORD Options, // 생성플래그 LPDIRECT3DDEVICE9 pdevice, // 메쉬연결장치 LPD3DXBUFFER **ppadjacency, // 메쉬접근정보 LPD3DXBUFFER **ppmaterials, // 메쉬재질정보 LPD3DXBUFFER **ppeffectinstances, // 이펙트개체 : 0 PDWORD pnummaterials, // 메쉬의재질수 LPD3DXMESH *ppmesh // 메쉬 ) 애니메이션및게임실습 26
재질 텍스처데이터의파일명소유 typedef struct D3DXMATERIAL { D3DMATERIAL9 MatD3D; LPSTR ptexturefilename; } // 재질구조체 // 텍스처파일명 애니메이션및게임실습 27
정점법선생성 조명을위해정점법선생성필요 HRESULT D3DXComputeNormals ( LPD3DXBASEMESH pmesh, const DWORD *padjaceny ) // 메쉬 // 인접정보 법선평균이용 인접정보를이용하여중복정점제거 인접정보부재시중복정점도같이계산 정점포맷 : D3DFVF_NORMAL 애니메이션및게임실습 28
정점법선생성 // 메쉬가정점포맷으로 D3DFVF_NORMAL을가지고있는가? if(!(pmesh->getfvf() GtFVF() & D3DFVF_NORMAL)) { // 새메쉬를복제하고포맷으로 D3DFVF_NORMAL 추가 ID3DXMesh* ptempmesh p = 0; pmesh->clonemeshfvf( D3DXMESH_MANAGED, pmesh->getfvf() D3DFVF_NORMAL, Device, &ptempmesh); // 법선계산 D3DXComputeNormals(pTempMesh, p 0); } pmesh->release(); pmesh = ptempmesh; // 기존메쉬제거 // 새메쉬저장 애니메이션및게임실습 29
예제 애니메이션및게임실습 30
경계볼륨 경계볼륨 원기둥, 타원면, 마름모꼴, 캡슐형 구, 상자 애니메이션및게임실습 31
경계볼륨 경계볼륨 가시성테스트 메쉬의경계볼륨이보이지않는다면메쉬역시보이지않음 충돌테스트 미사일과메쉬의경계볼륨간의충돌검출 애니메이션및게임실습 32
경계볼륨 경계볼륨 HRESULT D3DXComputeBoundingSphere( LPD3DXVECTOR3 pfirstposition, iti // 정점배열의첫번째정점 DWORD NumVertices, // 정점의수 DWORD dwstride, // 정점저장크기 D3DXVECTOR3* pcenter, // 경계구체의중심 FLOAT* pradius // 경계구체의반지름 ); HRESULT D3DXComputeBoundingBox( LPD3DXVECTOR3 pfirstposition, DWORD NumVertices, DWORD dwstride, D3DXVECTOR3* pmin, D3DXVECTOR3* pmax ); // 정점배열의첫번째정점 // 정점의수 // 정점저장크기 // 최소점 // 최대점 애니메이션및게임실습 33
경계볼륨 예제 애니메이션및게임실습 34
Question? 애니메이션및게임실습 35