ASE 파일 포맷

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
  현재 오브젝트가 참조하는 재질의 번호.
 }


출처 : http://rajent.tistory.com/50

참고 : http://wiki.beyondunreal.com/Legacy:ASE_File_Format

Posted by Junios

2009/03/13 16:18 2009/03/13 16:18
, ,
Response
No Trackback , No Comment
RSS :
http://junios.net/tc/rss/response/241

ASE 파일구조

ASE의 전반적인 구조
1. File Head : ase 버전이나 comment 등의 정보를 담고 있다.
2. Scene : 프래임의 전반적인 정보를 담고 있따.
3. Material List : 사용된 머터리얼이며, 텍스쳐도 포함되어 있다.
4. Object List : 각종 Object 들을 담고 있다.






Scene
ASE의 제일 앞쪽 정보로 프레임에 관련된 정보를 담고 있다.


Material List
Material 이긴 하지만 DX 와 다른 개념이다.
3D MAX 머터리얼은 DX의 Material 과 Texture 를 함친것이다.
3D MAX 에선 서브머터리얼도 있지만 DX에선 다 하나의 Material 로 인지해야 하낟.


Object List
구현에 필요한 각종 객체들을 나열해 놓은 것이다.


출처 : http://ikpil.com/627

Posted by Junios

2009/02/24 10:01 2009/02/24 10:01
,
Response
No Trackback , No Comment
RSS :
http://junios.net/tc/rss/response/232

ASE 파일 구조

*3DSMAX_ASCIIEXPORT 200  //맥스 ASE파일 검사
*COMMENT "AsciiExport Version  2.00 - Fri Feb 03 14:56:28 2006"
*SCENE {
 *SCENE_FILENAME ""
 *SCENE_FIRSTFRAME 0
 *SCENE_LASTFRAME 100         //애니메이션 마지막 프레임
 *SCENE_FRAMESPEED 30        //1초당 프레임 수
 *SCENE_TICKSPERFRAME 160  //애니메이션은 Tick수로 저장되는데

                                               //이떄 한 프레임당 Tick수이다. 초당 Tick을 구하려면

                                               //TICKSPERFRAME * FRAMESPEED 하면 되겠다.


 *SCENE_BACKGROUND_STATIC 0.0000 0.0000 0.0000
 *SCENE_AMBIENT_STATIC 0.0000 0.0000 0.0000
}


*MATERIAL_LIST {
 *MATERIAL_COUNT 1          //총 재질 개수
 *MATERIAL 0 {
  *MATERIAL_NAME "01 - Default"
  *MATERIAL_CLASS "Standard"
  *MATERIAL_AMBIENT 0.9961 1.0000 1.0000     //AMBIENT 컬러
  *MATERIAL_DIFFUSE 0.9961 1.0000 1.0000      //DIFFUSE 컬러
  *MATERIAL_SPECULAR 0.9000 0.9000 0.9000  //SPECULAR 컬러
  *MATERIAL_SHINE 0.1000
  *MATERIAL_SHINESTRENGTH 0.0000
  *MATERIAL_TRANSPARENCY 0.0000
  *MATERIAL_WIRESIZE 1.0000
  *MATERIAL_SHADING Blinn
  *MATERIAL_XP_FALLOFF 0.0000
  *MATERIAL_SELFILLUM 0.0000
  *MATERIAL_FALLOFF In
  *MATERIAL_XP_TYPE Filter

 

//하나의 재질에 속한 맵의 종류다. 여기서는 DIFFUSE, SPECULAR, OPACITY맵만

//적용하였다. (솔찍히 다른것은 필요 없다고하니...)


  *MAP_DIFFUSE {
   *MAP_NAME "Background_Lake_MT"    //맵 이름
   *MAP_CLASS "Bitmap"                        //맵 종류? (여기서는 비트맵으로 설정)

   *MAP_SUBNO 1                                  //맥스에서 맵의 순서다. (필요는 없지만 참고..)
   *MAP_AMOUNT 0.6600                        //맵의 적용 수치이다. 100%가 1.0
   *BITMAP "C:\3dsmax7\maps\Backgrounds\Lake_mt.jpg"

                                                          //맵에 적용된 비트맵

 

   //기타 맵의 UV설정인데 맥스 작업에서도 보통은 쓰이지 않음
   *MAP_TYPE Screen                        
   *UVW_U_OFFSET 0.0000
   *UVW_V_OFFSET 0.0000
   *UVW_U_TILING 1.0000
   *UVW_V_TILING 1.0000
   *UVW_ANGLE 0.0000
   *UVW_BLUR 1.0000
   *UVW_BLUR_OFFSET 0.0000
   *UVW_NOUSE_AMT 1.0000
   *UVW_NOISE_SIZE 1.0000
   *UVW_NOISE_LEVEL 1
   *UVW_NOISE_PHASE 0.0000
   *BITMAP_FILTER Pyramidal
  }

   //스펙큘러 맵 정보 (이것도 안쓴다고 하는데... 별도로 프로그래밍 해야 하나..)
  *MAP_SPECULAR {
   *MAP_NAME "Map #10"
   *MAP_CLASS "Bitmap"
   *MAP_SUBNO 2
   *MAP_AMOUNT 0.6500
   *BITMAP "C:\3dsmax7\maps\Brick\Yellobrk.JPG"
--------------------------------------생략
   *BITMAP_FILTER Pyramidal
  }

//매핑시 UVW map은 일반 단순 모형에 대한 매핑을 입히지만,

//복잡한 메쉬에 대한 매핑은 Unwrap UVW를 쓴다나~

 

//다음은 메쉬 정보이다.

//일반적으로ID를 가진 메쉬 단위로 나뉘는듯 하다.

*GEOMOBJECT {
 *NODE_NAME "Bip01 Footsteps"    //계층 구조 생성시 필요하다.
 *NODE_PARENT "Bip01"              
 *NODE_TM {
  *NODE_NAME "Bip01 Footsteps"
  *INHERIT_POS 1 1 1
  *INHERIT_ROT 1 1 1
  *INHERIT_SCL 1 1 1

//메쉬 자체 확대 축소 회전을 정의한 행렬이다. 즉 최초 로컬 기준으로

//월드 변환을 위한 행렬값이다.

//그런데 중요한것은 맥스에서는 Y, Z축이 서로 반대가 되므로

//행렬 순서 역시 다음과 같이 지정 되어야 하겠다.                  

   11, 13, 12

   31, 33, 32

   21, 23, 22

   41, 43, 42


  *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.0299 -0.0258 0.0280


  *TM_POS 0.0299 -0.0258 0.0280  //보는대로 위의 행렬 이동 값과, 이동 수치가 같다.


  *TM_ROTAXIS 0.0000 0.0000 0.0000  //회전 축 (즉 회전하는 임의의 벡터축에 대한 회전값이다)
  *TM_ROTANGLE 0.0000                  //회전값
  *TM_SCALE 1.0000 1.0000 1.0000     //크기...
  *TM_SCALEAXIS 0.0000 0.0000 0.0000 //크기 변환 축
  *TM_SCALEAXISANG 0.0000
 }
 *MESH {
  *TIMEVALUE 640
  *MESH_NUMVERTEX 9   //버텍스 개수
  *MESH_NUMFACES 8     //면 수
  *MESH_VERTEX_LIST {//정점 좌표
   *MESH_VERTEX    0 0.0299 -0.0258 0.0280
   *MESH_VERTEX    1 0.0465 -0.0258 0.0280
   *MESH_VERTEX    2 0.0417 -0.0141 0.0280
   *MESH_VERTEX    3 0.0299 -0.0092 0.0280
   *MESH_VERTEX    4 0.0182 -0.0141 0.0280
   *MESH_VERTEX    5 0.0133 -0.0258 0.0280
   *MESH_VERTEX    6 0.0182 -0.0376 0.0280
   *MESH_VERTEX    7 0.0299 -0.0424 0.0280
   *MESH_VERTEX    8 0.0417 -0.0376 0.0280
  }

  //일반적으로 uv 매핑을 할때 정점의 숫자와 u,v좌표 숫자가 일치하나 게임의 하나의 메쉬라도

  //각 각의 면에대한 다른 텍스처 매핑시에 별도의 u, v좌표가 필요하가 이를 일일이 지정해야 한

  //다. 그러기 위해서는 별도의 정점을 추가하거나 아니면 해당 면에 재질 정보를 지정 하는 방법

 // 이 있는데 여기서는 MESH_MTLID를 참조하여 매핑한다. 다음의 경우 정 육면체 매핑인데

 //정육면체 한 면에 대한 페이스는 2개가 동일할 것이므로 2면에 대한 아이디가 동일 한것을 볼

 //수 있다. (참고로 이건... 정 육면체가 아닌듯;;;)
  *MESH_FACE_LIST {
   *MESH_FACE    0:    A:    0 B:    1 C:    2 AB:    0 BC:    1 CA:    0  *MESH_SMOOTHING 2  *MESH_MTLID 0
   *MESH_FACE    1:    A:    0 B:    2 C:    3 AB:    0 BC:    1 CA:    0  *MESH_SMOOTHING 2  *MESH_MTLID 0

   ------------------생략-----------------------------
    *MESH_FACE    7:    A:    0 B:    8 C:    1 AB:    0 BC:    1 CA:    0  *MESH_SMOOTHING 2  *MESH_MTLID 0
  }

*MESH_NUMTVERTEX 12 //UV용 버텍스 개수, 단 해당 메쉬의 정점 개수와 일치 하지 않을 수

                                     //있다. 즉 필요한 만큼 늘여 할당

  *MESH_TVERTLIST {
   *MESH_TVERT 0 0.0000 0.0000 0.0000
   *MESH_TVERT 1 1.0000 0.0000 0.0000
   *MESH_TVERT 2 0.0000 1.0000 0.0000
   *MESH_TVERT 3 1.0000 1.0000 0.0000
   *MESH_TVERT 4 0.0000 0.0000 0.0000
   *MESH_TVERT 5 1.0000 0.0000 0.0000
   *MESH_TVERT 6 0.0000 1.0000 0.0000
   *MESH_TVERT 7 1.0000 1.0000 0.0000
   *MESH_TVERT 8 0.0000 0.0000 0.0000
   *MESH_TVERT 9 1.0000 0.0000 0.0000
   *MESH_TVERT 10 0.0000 1.0000 0.0000
   *MESH_TVERT 11 1.0000 1.0000 0.0000
  }

//그리고 해당 면에 버텍스 참조 인덱스이다. 면에 속하는 각 점에 대한

//위에 해당 버텍스값을 참조 한다.

  *MESH_NUMTVFACES 12
  *MESH_TFACELIST {
   *MESH_TFACE 0 9 11 10
   *MESH_TFACE 1 10 8 9
   *MESH_TFACE 2 8 9 11
   *MESH_TFACE 3 11 10 8
   *MESH_TFACE 4 4 5 7
   *MESH_TFACE 5 7 6 4
   *MESH_TFACE 6 0 1 3
   *MESH_TFACE 7 3 2 0
   *MESH_TFACE 8 4 5 7
   *MESH_TFACE 9 7 6 4
   *MESH_TFACE 10 0 1 3
   *MESH_TFACE 11 3 2 0
  }

 

  *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
 
   *MESH_FACENORMAL 11 -1.0000 0.0000 0.0000
    *MESH_VERTEXNORMAL 4 -1.0000 0.0000 0.0000
    *MESH_VERTEXNORMAL 6 -1.0000 0.0000 0.0000
    *MESH_VERTEXNORMAL 2 -1.0000 0.0000 0.0000

 *PROP_MOTIONBLUR 0
 *PROP_CASTSHADOW 1
 *PROP_RECVSHADOW 1


 *TM_ANIMATION {
  *NODE_NAME "Bip01 Footsteps"
  *CONTROL_POS_TRACK {   //이동 애니 값
   *CONTROL_POS_SAMPLE 640 0.1565 -0.0000 -0.4964
   *CONTROL_POS_SAMPLE 1280 0.1532 0.0000 -0.4250
   *CONTROL_POS_SAMPLE 1920 0.1518 0.0000 -0.4273
   *CONTROL_POS_SAMPLE 2560 0.1428 0.0000 -0.4324
   *CONTROL_POS_SAMPLE 3200 0.1522 -0.0000 -0.4827
  }
  *CONTROL_ROT_TRACK {   //회전 애니 값

   //단 순서는 해당 Tick에 맞춰서 값이 변환 된다.

                                      //Tick  회전축 벡터            변환앵글

   *CONTROL_ROT_SAMPLE 640 0.1504 0.1504 -0.9771 1.5939
   *CONTROL_ROT_SAMPLE 1280 0.0000 1.0000 -0.0000 0.0404
   *CONTROL_ROT_SAMPLE 1920 -0.0000 -1.0000 -0.0000 0.0045
   *CONTROL_ROT_SAMPLE 2560 -0.0000 -1.0000 0.0000 0.0225
   *CONTROL_ROT_SAMPLE 3200 0.0000 -1.0000 0.0000 0.0135

 

 *CONTROL_SCALE_TRACK {  

    //처음것은 최초 스캐일 값  Tick  스케일 값(x, y, z에 대한)  스케일 축?          앵글
   *CONTROL_SCALE_SAMPLE 0 1.0000 0.7817 0.7817 -0.0057 -0.0005 -1.0000 0.1857
   *CONTROL_SCALE_SAMPLE 8000 0.9999 0.7817 0.7835 -0.0640 0.0805 -0.9947 0.1844
   *CONTROL_SCALE_SAMPLE 8800 0.9997 0.7817 0.7870 -0.1049 0.1383 -0.9848 0.1846

  }
 }
 *WIREFRAME_COLOR 0.6510 0.7922 0.9412  (디폴트 색상)

또는

*MATERIAL_REF 1 (위에 만들어논 재질 중 참조 재질 )
}

출처 : http://recuerdame.springnote.com/pages/459261

Posted by Junios

2009/02/24 09:41 2009/02/24 09:41
,
Response
No Trackback , No Comment
RSS :
http://junios.net/tc/rss/response/231


블로그 이미지

Junios World

- Junios

Archives

Authors

  1. Junios

Calendar

«   2010/09   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

Site Stats

Total hits:
32815
Today:
25
Yesterday:
139