3D Graphics/공통

Ase 파싱

rajent 2007. 5. 7. 15:10
728x90

Ase 파싱

Ase는 크게 3개의 단위로 이루어져 있다.
각 단위는 씬 정보(*SCENE), 재질 정보(*MATERIAL_LIST), 오브젝트 정보(*GEOMOBJECT)이며,
오브젝트 정보의 경우 추가로 몇 종이 더 있는데 주로 *HELPEROBJECT를 들 수 있다.

이하 세부적으로 꼭 필요한 토큰만 언급하겠다.


//////////////////////////////////////////////////////////////////////////////////////
*SCENE
애니메이션과 관련된 정보를 담는다.

 *SCENE_FIRSTFRAME 0
 애니메이션의 시작 프레임
 *SCENE_LASTFRAME 100
 애니메이션의 마지막 프레임
 *SCENE_FRAMESPEED 30
 초당 프레임
 *SCENE_TICKSPERFRAME 160
 프레임당 틱
 
 애니메이션 1초당 틱 = 초당 프레임 * 프레임당 틱
 대략 4800이며, 애니메이션 보간을 위한 기준값으로 사용된다.
 

//////////////////////////////////////////////////////////////////////////////////////
*MATERIAL_LIST
재질 및 텍스처에 관한 정보를 담는다. 토큰이 많지만 실제로 쓰이는 것은 극히 일부이다.
각 재질은 서브 재질을 가질 수 있다. 서브 재질은 또 서브 재질을 가질 수 있는 구조이지만
실제로 그러한 구조가 쓰이지도 않으며 허용되서도 안 된다.
각 재질은 오브젝트 별로 참조하며, 서브 재질은 페이스 별로 참조하게 된다.

 *MATERIAL_COUNT 1
 총 재질 수
 *MATERIAL 0 {
 번호에 해당하는 재질의 묶음
  *MATERIAL_NAME "Material #2"
  재질 이름: 필요없지만, 필요할지도...
  *MATERIAL_CLASS "Standard"
  *MATERIAL_CLASS "Multi/Sub-Object"
  재질 클래스: 현재 재질이 서브 재질을 포함하는지 여부를 나타낸다. "Standard"는 없고, "Multi..."는 있다.
  지금으로써는 필요없다.
  *MATERIAL_AMBIENT 0.1000 0.1000 0.1000
  *MATERIAL_DIFFUSE 0.7000 0.7000 0.7000
  *MATERIAL_SPECULAR 0.9000 0.9000 0.9000
  앰비언트, 디퓨즈, 스펙큘라값
  *NUMSUBMTLS 15
  현재 재질이 가진 서브 재질의 개수. 서브 재질이 없으면 이 항목은 존재하지 않는다.
  *SUBMATERIAL 0 {
  번호에 해당하는 서브 재질의 묶음
   // 중복 정보 생략. 재질과 출력되는 정보가 동일하다.
   *MAP_DIFFUSE {
   디퓨즈 맵: 여기서는 텍스처 정보만 필요하다.
    *BITMAP "F:\Turret\Turret\Maps\T_Siren1.bmp"
    텍스처 경로: 절대 경로이기 때문에 파일명만을 얻어와야 한다.
 

//////////////////////////////////////////////////////////////////////////////////////
*GEOMOBJECT
오브젝트에 관한 정보(버텍스, 인덱스, UV 등)를 담는다. 오브젝트는 트리 구조로 이루어질 수 있다.

 *NODE_NAME "Box01"
 현재 오브젝트의 이름이다. 트리 구조에서 서로를 이름으로 참조하므로 중요한 값이다.
 *NODE_PARENT "Box00"
 부모 오브젝트의 이름이다. 계층을 이루지 않거나 지금 오브젝트가 부모라면 없는 항목이다.
  *NODE_TM {
  매트릭스 정보
   *TM_ROW0 1.0000 0.0000 0.0000
   *TM_ROW1 0.0000 1.0000 0.0000
   *TM_ROW2 0.0000 0.0000 1.0000
   *TM_ROW3 0.0000 0.0000 0.0000
   4x3 매트릭스. 로테이션, 스케일, 트랜스폼이 적용되어 있다.
   *TM_POS 0.0000 0.0000 0.0000
   위 행렬의 4행과 같다.
   *TM_ROTAXIS 0.0000 0.0000 0.0000
   로테이션 축
   *TM_ROTANGLE 0.0000
   로테이션 값(회전각)
   *TM_SCALE 1.0000 1.0000 1.0000
   스케일 값
   
   로테이션과 스케일을 행렬에서 분리해내기가 까다로우므로(불가능하지는 않은듯)
   위 두 값을 따로 가지고 있는 편이 편할 수 있다.
   이 값들의 실질적인 사용은 애니메이션을 설명할 때 다룬다.
  }
  *MESH {
  매쉬 정보: 실제 오브젝트를 이루는 값들이다.
   *MESH_NUMVERTEX 8
   매쉬를 이루는 버텍스의 개수
   *MESH_NUMFACES 12
   페이스의 개수
   *MESH_VERTEX_LIST {
   버텍스 리스트
    *MESH_VERTEX    0 -10.0000 -10.0000 0.0000
    번호에 해당하는 버텍스의 좌표. x, z, y 순서이므로 dx에서는 두번째 세번째 값을 바꾸어 주어야 한다.
    당연히 위의 *MESH_NUMVERTEX 개수 만큼 있다.
   }
   *MESH_FACE_LIST {
   페이스 리스트
    *MESH_FACE    0:    A:    0 B:    2 C:    3 AB:    1 BC:    1 CA:    0  *MESH_SMOOTHING 2  *MESH_MTLID 1
    번호에 해당하는 페이스의 정보.
    페이스는 버텍스 3개로 이루어지는데 A:, B:, C: 뒤의 각 숫자가 버텍스 리스트의 해당 버텍스 인덱스이다.
    감는 순서가 dx와 반대이므로 1, 3, 2 순서로 저장하여야 한다.
    가장 뒤의 *MESH_MTLID는 서브 재질의 인덱스이다. 주의할 점은 잘못된 값이 들어갈 수 있으므로 검출 코드가 필요하다.
    재질 정보와 텍스처를 교체하는 것은 비싼 연산이므로 참조하는 서브 재질의 번호로 정렬하여 렌더링한다. 또한 서브 재질이 없어도 이 값은 아무 값이나 존재하므로 서브 재질의 유무도 판별해야 한다.
   }
   *MESH_NUMTVERTEX 12
   텍스처 uv 좌표의 개수
   *MESH_TVERTLIST {
   텍스처 uv 좌표 리스트
    *MESH_TVERT 0 0.0000 0.0000 0.0000
    번호에 해당하는 uv 좌표. 마지막 값은 버린다.
    원점이 좌하단이므로 좌상단이 원점인 dx에서 쓰려면 v좌표를 1.0f-v로 보정해야 한다.
   }
   *MESH_NUMTVFACES 12
   텍스처가 적용된 페이스의 개수
   *MESH_TFACELIST {
   페이스의 uv 좌표 리스트
    *MESH_TFACE 0 9 11 10
    번호에 해당하는 페이스의 uv 좌표 인덱스. 역시 1, 3, 2 순서로 적용하여야 한다.
   }
   *MESH_NUMCVERTEX 0
   버텍스 컬러. 쓸 일이 있을까? 잘 모르겠다.
   *MESH_NORMALS {
   노멀
    *MESH_FACENORMAL 0 0.0000 0.0000 -1.0000
    페이스 노멀. 필요없는 값이지 싶다.
     *MESH_VERTEXNORMAL 0 0.0000 0.0000 -1.0000
     *MESH_VERTEXNORMAL 2 0.0000 0.0000 -1.0000
     *MESH_VERTEXNORMAL 3 0.0000 0.0000 -1.0000
     페이스를 이루는 버텍스의 노멀. 번호는 버텍스의 인덱스이다. 역시 x, z, y이므로 y, z 순서로 바꾸어 준다.
   }
  }
  *TM_ANIMATION {
  애니메이션에 관한 내용은 생략. 복잡한 내용이 연계되어 있으므로 나중에..
   *NODE_NAME "Box01"
   *CONTROL_POS_TRACK {
    *CONTROL_POS_SAMPLE 0 0.0000 0.0000 0.0000
    *CONTROL_POS_SAMPLE 800 7.8125 0.0000 0.0000
   }
   *CONTROL_ROT_TRACK {
    *CONTROL_ROT_SAMPLE 800 -1.0000 0.0000 0.0000 0.2454
    *CONTROL_ROT_SAMPLE 1600 -1.0000 0.0000 0.0000 0.5400
   }
   *CONTROL_SCALE_TRACK {
    *CONTROL_SCALE_SAMPLE 0 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000
    *CONTROL_SCALE_SAMPLE 800 1.1563 1.1563 1.1563 0.0000 0.0000 0.0000 0.0000

   }
  }
  *MATERIAL_REF 0
  현재 오브젝트가 참조하는 재질의 번호.
 }