Post on 31-Aug-2019
transcript
DirectX9 프로그래밍의 기초2
목 차
XFilXFile
파일 포맷ID3DXBufferID3DXBufferXFile 사용하기
경계 볼륨경계 볼륨
애니메이션및 게임 실습 2
XFile
3D Modeler
3DS MaxLightWave 3DMayaMaya
메쉬 데이터
기하정보재질애니메이션
애니메이션및 게임 실습 3
XFile
XFile
.XDirectX에서 사용하는 파일 포맷
파일 처리 함수를 DirectX가 제공
파일 종류파일 종류
ASCIIBinaryBi C dBinary Compressed
애니메이션및 게임 실습 4
XFile
파일 포맷
사용자 정의 데이터 형
X파일은 사용자에 의해 정의된 템플릿에 의해 동작X파일은 사용자에 의해 정의된 템플릿에 의해 동작템플릿은 데이터 개체가 어떻게 저장되어야 하는 지를 정의
계층적 관계
선택적 멤버 : 템플릿이 허용하는 데이터 타입들. 선택적 멤버들은 데이터 개체의 자식 멤버로 저장됨자식 멤버 : 다른 데이터 개체 다른 개체의 참조 이진 데이터자식 멤버 : 다른 데이터 개체, 다른 개체의 참조, 이진 데이터
애니메이션및 게임 실습 5
XFile
square.xq
애니메이션및 게임 실습 6
XFile
헤더
xof 0303txt 0032
파일의 시작 : xof파일의 시작 : xof버전 : 03.03파일 포맷 : txt, bin, tzip, bzip부동 소수점 데이터 타입 : 0032, 0064
애니메이션및 게임 실습 7
XFile
메시
Mesh Square {정점의 수
Mesh Square {8; // 정점의 수정점의 수
정점정보면의 수면 정보메시 재질 리스트
8; // 정점의 수1.0; 1.0; 0.0;, // vertice 0-1.0; 1.0; 0.0;, // vertice 1-1.0;-1.0; 0.0;, // vertice 21 0 1 0 0 0 // i 3메시 재질 리스트
}1.0;-1.0; 0.0; // vertice 31.0; 1.0; 0.0;, // vertice 41.0;-1.0; 0.0;, // vertice 5-1.0;-1.0; 0.0;, // vertice 6; ; ;,-1.0; 1.0; 0.0;; // vertice 74; // 면의 수3;0,1,2;, // triangle #13 0 2 3 // t i l #23;0,2,3;, // triangle #23;4,5,6;, // triangle #33;4,6,7;; // triangle #4
}
애니메이션및 게임 실습 8
}
XFile
메시 재질 리스트
MeshMaterialList는 매시 개체의 자식 개체로서 메시 개체의 일부로 동작재질의 개수, 면의 개수, 재질
MeshMaterialList {{1; // one material4; // one face0, // face #0 use material #00 // face #1 use material #00, // face #1 use material #00, // face #2 use material #00;; // face #3 use material #0
}
애니메이션및 게임 실습 9
XFile
재질
재질의 색, 힘, 반사광 색상, 발광 색상
Material { // material #00 0;1 0;0 5;1 0;; // face color0.0;1.0;0.5;1.0;; // face color0.0; // power0.0;0.0;0.0;; // specular color0.0;0.0;0.0;; // emissive color
}
애니메이션및 게임 실습 10
XFile
square2.xq
애니메이션및 게임 실습 11
XFile
VertexDuplicationIndicesp
메시 한 개 당 하나씩 생성
메시 내의 어떤 정점들이 중복되는지에 대한 정보메시 내의 어떤 정점들이 중복되는지에 대한 정보
매끄러운 부분 혹은 재질 경계에서 발생
메시 단순화 프로그램에서 사용
애니메이션및 게임 실습 12
XFile
법선 벡터
MeshNormals {8;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;0.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
}
XFile
텍스처
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
XFile
텍스처 좌표 매핑
MeshTextureCoords { MeshTextureCoords {MeshTextureCoords {8; // 4 texture coords1.0; 1.0;, // coord 01.0; 0.0;, // coord 1
// d
MeshTextureCoords {4; 1.0; 1.0;, // coord 01.0; 0.0;, // coord 1
// d0.0; 0.0;, // coord 20.0; 1.0;; // coord 31.0; 1.0;, // coords 41.0;-1.0;, // coords 5
0.0; 0.0;, // coord 20.0; 1.0;; // coord 3
}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 21.0; -1.0;; // coord 3
}
애니메이션및 게임 실습 15
}
XFile
square3.xq
애니메이션및 게임 실습 16
XFile
boidy.xy
애니메이션및 게임 실습 17
XFile
boidy.xy
애니메이션및 게임 실습 18
XFile
변환 행렬
프레임 : 물체의 각 부분을 별개로 움직이게 하려면 모델을 여러 개의 프레임으로구분전차 : 포 상하좌우 바퀴 궤도전차 : 포 – 상하좌우, 바퀴, 궤도
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
XFile
AnimationSet
Positionkey
0 : scaling0 : scaling1 : rotation2 : translation4 : matrix
애니메이션및 게임 실습 20
XFile
AnimationSet
AnimationSetMoveX{Animation{{
AnimationKey{4;//Positionkeys5;//5keys0;16;1 0 0 0 0 0 0 00;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,0 2 0 0 0 0 1 0;;0.2,0.0,0.0,1.0;;,
애니메이션및 게임 실습 21
XFile
AnimationSet
160;16;1.0,0.0,0.0,0.0,0 0 1 0 0 0 0 00.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 0320;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;;,
}{SQUARE_Root}
}}
애니메이션및 게임 실습 22
}
XFile
square4.xq
애니메이션및 게임 실습 23
XFile
ID3DXBuffer
연속적인 메모리 블록에 데이터를 저장하기 위해 이용하는 범용 데이터 구조체
LPVOID GetBufferPointer() : 데이터의 시작 포인터LPVOID GetBufferPointer() : 데이터의 시작 포인터DWORD GetBufferSize() : 버퍼 크기
데이터 형 변환
DWORD* info = (DWORD*)adjacencyInfo->GetBufferPointer();( ) j y ()D3DXMATERIAL* mtrl = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();
adjacencyInfo->Release();mtrlBuffer->Release();
애니메이션및 게임 실습 24
XFile
ID3DXBuffer
HRESULT D3DXCreateBuffer((
DWORD NumBytes, // 버퍼의 크기LPD3DXBUFFER *ppBuffer // 생성된 버퍼
);
ID3DXBuffer* buffer = 0;D3DXCreateBuffer(4*sizeof(int), &buffer);
애니메이션및 게임 실습 25
XFile
Load
HRESULT D3DXLoadMeshFromX((
LPCSTR pFileName, // XFile명DWORD Options, // 생성 플래그LPDIRECT3DDEVICE9 pDevice, // 메쉬 연결 장치LPD3DXBUFFER ** Adj // 메쉬 접근 정보LPD3DXBUFFER **ppAdjacency, // 메쉬 접근 정보LPD3DXBUFFER **ppMaterials, // 메쉬 재질 정보LPD3DXBUFFER **ppEffectInstances, // 이펙트 개체 : 0PDWORD pNumMaterials, // 메쉬의 재질 수p ,LPD3DXMESH *ppMesh // 메쉬
)
애니메이션및 게임 실습 26
XFile
재질
텍스처 데이터의 파일명 소유
typedef struct D3DXMATERIAL {
D3DMATERIAL9 MatD3D; // 재질 구조체LPSTR pTextureFileName; // 텍스처 파일명
}
애니메이션및 게임 실습 27
XFile
정점 법선 생성
조명을 위해 정점 법선 생성 필요
HRESULT D3DXC t N lHRESULT D3DXComputeNormals(
LPD3DXBASEMESH pMesh, // 메쉬const DWORD *pAdjaceny // 인접 정보
법선 평균 이용인접 정보를 이용하여 중복 정점 제거
p j y)
인접 정보를 이용하여 중복 정점 제거인접 정보 부재시 중복 정점도 같이 계산
정점 포맷 : D3DFVF_NORMAL
애니메이션및 게임 실습 28
XFile
정점 법선 생성
// 메쉬가 정점 포맷으로 D3DFVF_NORMAL을 가지고 있는가?if(!( M h G tFVF() & D3DFVF NORMAL))if(!(pMesh->GetFVF() & D3DFVF_NORMAL)){
// 새 메쉬를 복제하고 포맷으로 D3DFVF_NORMAL 추가ID3DXMesh* pTempMesh = 0;p p ;pMesh->CloneMeshFVF(
D3DXMESH_MANAGED,pMesh->GetFVF() | D3DFVF_NORMAL,D iDevice,&pTempMesh);
// 법선 계산D3DXComputeNormals(pTempMesh, 0);p (p p , );
pMesh->Release(); // 기존 메쉬 제거pMesh = pTempMesh; // 새 메쉬 저장
}
애니메이션및 게임 실습 29
}
XFile
예제
애니메이션및 게임 실습 30
경계 볼륨
경계 볼륨
원기둥, 타원면, 마름모꼴, 캡슐형
구 상자구, 상자
애니메이션및 게임 실습 31
경계 볼륨
경계 볼륨
가시성 테스트
메쉬의 경계 볼륨이 보이지 않는다면 메쉬 역시 보이지 않음메쉬의 경계 볼륨이 보이지 않는다면 메쉬 역시 보이지 않음
충돌 테스트
미사일과 메쉬의 경계 볼륨간의 충돌 검출
애니메이션및 게임 실습 32
경계 볼륨
경계 볼륨
HRESULT D3DXComputeBoundingSphere(LPD3DXVECTOR3 Fi tP iti // 정점 배열의 첫번째 정점LPD3DXVECTOR3 pFirstPosition, // 정점 배열의 첫번째 정점DWORD NumVertices, // 정점의 수DWORD dwStride, // 정점 저장 크기D3DXVECTOR3* pCenter, // 경계 구체의 중심p ,FLOAT* pRadius // 경계 구체의 반지름
);
HRESULT D3DXComputeBoundingBox(LPD3DXVECTOR3 pFirstPosition, // 정점 배열의 첫번째 정점DWORD NumVertices, // 정점의 수DWORD dwStride, // 정점 저장 크기D3DXVECTOR3* pMin, // 최소점D3DXVECTOR3* pMax // 최대점
);
애니메이션및 게임 실습 33
);
경계 볼륨
예제
애니메이션및 게임 실습 34
Question?Question?Question?Question?
애니메이션및 게임 실습 35