본문 바로가기

Direct3D

[DirectX3D] ASE File 구조

* 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