* DirectX 프로젝트에 ASE 파일의 데이터들을 불러올 때 필요한 데이터 목록 및 주의해야할 것들.
* 각 데이터에 대한 자세한 정보는 없음.
1. Scene
- *SCENE_FIRSTFRAME : 시작 프레임
- *SCENE_LASTFRAME : 마지막 프레임
- *SCENE_FRAMESPEED : 프레임 속도
- *SCENE_TICKSPERFRAME : 프레임당 틱
2. MATERIAL_LIST
// 총 Material의 개수
- *MATERIAL_COUNT
// Ambient, Diffuse, Specular 모두 r, g, b값을 넣어준 뒤 a에 1을 넣어준다.
- *MATERIAL_AMBIENT
- *MATERIAL_DIFFUSE
- *MATERIAL_SPECULAR
// 텍스처 경로
- *BITMAP
3. GEOMOBJECT
// 노드의 이름
- *NODE_NAME
// 부모 노드의 이름
- *NODE_PARENT
// 노드의 월드 행렬
- *NODE_TM
- *TM_ROW0
- *TM_ROW2
- *TM_ROW1
- *TM_ROW3
// 메시 정보
- *MESH
// 총 정점의 개수
- *MESH_NUMVERTEX
// 총 면의 개수
- *MESH_NUMFACES
// 정점 정보
- *MESH_VERTEX_LIST
- *MESH_VERTEX ( 인덱스 ) ( x값 ) ( z값 ) ( y값 )
// 면의 정보 ( 세 개의 정점으로 이루어진 삼각형 폴리곤들의 리스트 )
- *MESH_FACE_LIST
- *MESH_FACE A: ( 면의 첫 번째 점 ) B: ( 면의 세 번째 점 ) C: ( 면의 두 번째 점 )
// 텍스처 정점의 개수
- *MESH_NUMTVERTEX
// 텍스처 정점들의 정보
- *MESH_TVERTLIST
- *MESH_TVERT ( 정점 인덱스 ) ( u값 ) ( 1 - v값 ) ( w값 - 무시 )
// 텍스처 정점이 할당될 면의 개수
- *MESH_NUMTVFACES
// 각 면을 이루는 정점들에 할당될 텍스처 정점의 인덱스
- *MESH_TFACELIST
- *MESH_TFACE ( 면의 번호 ) ( 첫 번째 정점에 할당될 텍스처 좌표 인덱스 ) ( 세 번쨰 ) ( 두 번째 )
// 법선 정보
- *MESH_NORMALS
// 면의 법선
- *MESH_FACENORMAL ( 면의 번호) ( x값 ) ( z값 ) ( y값 )
- *MESH_VERTEXNORMAL ( 정점 번호 ) ( x값 ) ( z값 ) ( y값 ) // 면의 첫 번째 정점
- *MESH_VERTEXNORMAL ( 정점 번호 ) ( x값 ) ( z값 ) ( y값 ) // 면의 세 번째 정점
- *MESH_VERTEXNORMAL ( 정점 번호 ) ( x값 ) ( z값 ) ( y값 ) // 면의 두 번째 정점
// 애니 메이션 관련 트랙 정보
- *TM_ANIMATION
// 각 애니메이션의 Position 정보
- *CONTROL_POS_TRACK
- *CONTROL_POS_SAMPLE ( Tick ) ( x값 ) ( z값 ) ( y값 )
- *CONTROL_ROT_TRACK
- *CONTROL_ROT_SAMPLE ( Tick ) ( x값 ) ( z값 ) ( y값 ) ( w값 )
// 이 노드에 적용될 머테리얼 번호
- *MATERIAL_REF ( Material 번호 )
* 주의해야할 점
1. NODE_TM
ROW0 ~ ROW3 모두 y와 z값을 바꿔주어야 한다.
ROW1과 ROW2의 순서를 바꿔주어야 한다.
4번째 열은 { 0, 0, 0, 1 } 로 채워주어야 한다.
ex)
ROW0 : 1 2 3
ROW1 : 4 5 6
ROW2 : 7 8 9
ROW3 : 10 11 12
위의 데이터를 가져와 월드 행렬을 만들면 아래와 같은 행렬이 된다.
1 3 2 0
7 9 8 0
4 6 5 0
10 12 11 1
위의 행렬은 부모의 월드 행렬까지 곱해진 월드 행렬이므로,
부모의 월드 행렬의 역행렬을 곱하여 로컬 행렬로 저장해두는 것이 편리하다.
2. MESH_VERTEX
정점의 정보의 y와 z의 순서를 바꿔 x, z, y 순으로 저장해주어야 한다.
각 Vertex들에 NODE_TM에서 얻어온 월드 행렬, 즉 자신의 월드 행렬의 역행렬을 곱해주어
Vertex들이 로컬 좌표를 가지고 있게 한다.
3. MESH_FACE
삼각형 폴리곤을 구성하는 정점의 정보를 A, C, B 순으로 저장해주어야 한다.
4. MESH_TVERT
텍스처 좌표로, v에 해당하는 값은 1 - v로 바꿔주고 3번 째 값(w)은 무시한다.
5. MESH_TFACE
면을 구성하는 세 정점을 저장할 때 A, C, B순으로 저장했으므로,
텍스처 정보 또한 두 번째와 세 번째의 순서를 바꿔주어야 한다.
6. MESH_NORMALS
법선의 정보 또한 y와 z의 순서를 바꿔주어 x, z, y 순으로 저장해주어야 한다.
각 정점의 법선 정보를 저장할 때에도, 두 번째 줄과 세 번째 줄의 순서를 바꿔주어야 한다.
7. CONTROL_POS_SAMPLE
각 틱에 해당하는 y, z의 순서를 바꿔 x, z, y 순으로 저장해주어야 한다.
8. CONTROL_ROT_SAMPLE
각 틱에 해당하는 y, z의 순서를 바꿔 x, z, y, w 순으로 저장해주어야 한다.
쿼터니언으로 저장하기 위해 아래와 같은 공식을 통해 값을 저장한다.
D3DXQUATERNION qut;
qut.x = sinf(w / 2.f) * x;
qut.y = sinf(w / 2.f) * y;
qut.z = sinf(w / 2.f) * z;
qut.w = cosf(w / 2.f);
* 이전 프레임의 쿼터니언 값들이 누적되어야 한다.
만약 현재 저장하는 쿼터니언이 CONTROL_ROT_SAMPLE의 첫 번째 프레임에 해당하는 값이 아니라면,
즉 이전 프레임이 존재한다면 이전 프레임에 해당하는 쿼터니언의 값을 곱해주어야 한다.
9. Scene
시작 Tick : SCENE_FIRSTFRAME * SCENE_TICKSPERFRAME
마지막 Tick : SCENE_LASTFRAME * SCENE_TICKSPERFRAME
TM_ANIMATION의 정보를 통해 프레임 값을 알고 싶다면
해당 Frame = 해당 Tick값 / SCENE_TICKSPERFRAME 를 통해 구해주면 된다.
'Direct3D' 카테고리의 다른 글
[Direct3D] View, Projection, ViewPort Matrix (0) | 2019.08.20 |
---|