1. 목표 : ASE 포맷을 이용하여 캐릭터 애니메이션을 할 수 있도록 한다.
2. 진행방식
- 저 역시 ASE 공부를 오늘 부터 시작합니다.^^ 저처럼 애니메이션을 할려고 하지만 어떻게 시작해야 할지도
모르겠고 막막하신 분들은 같이 공부하신다는 생각으로 봐주시면 되겠습니다.
- 강좌는 캐릭터 애니메이션이 가능할때까지 하게 되겠습니다.
- 여타 책이나 블로그 같은곳에 좋은 문서들이 있기는 하지만 시행착오를 겪는 과정까지는 설명해줄 수가 없기
때문에 제가 시행착오?-_-;; 를 하는 것을 보시면서 같이 따라해 나가시면 도움이 되실지도 모르겠네요^^
- 단순 정확한 자료 나열식이 아닌 처음 제가 공부해 나가는 순서대로 진행하도록 하겠습니다.
- 강좌는 공부량이 많든 적든 하루에 한번씩 업데이트 하도록 하겠습니다.
- 아래 자료들을 참고하고 실제 적용 시켜보면서 느낀 점들이나 참고사항들 위주로 설명을 하게되겠습니다.
- 시행착오를 겪으면서 진행해나가는 방식이기 때문에 잘못된 점들이 많을 수 있습니다. 수정가능하도록
많은 질책 부탁드리겠습니다.
3. 참고 자료
- DirectX 9.x 3D 게임 프로그래밍 ( 24장 ~ 27장 정도..)
- http://blog.naver.com/4000blue?Redirect=Log&logNo=140012712414
( 이 블로그에 있는 내용은 이 책에 있는 내용과 거의 동일합니다.)
4. 참고 사항
- 공부하시면서 의문점이나 잘못된 점들은 댓글로 달아주시면 되겠습니다.
5. 대상
- Direct3D SDK의 Tutorial 정도의 기본 내용들은 해보신 분들을 위주가 될 것 같습니다..
=====================================================================================================
< 캐릭터 애니메이션이 되기 까지 필요한 과정 >
1. 3DS MAX로 하나 또는 여러개로 이루어진 메시를 모델링을 한다.
2. 만들어진 메시를 ASE 포맷으로 Export 한다.
3. Export 된 ASE 파일을 분석해서 필요한 모델 정보만을 읽어 출력에 사용하도록 파싱(Parsing) 한다.
4. 파싱된 메시의 정보 및 Animation 정보들을 이용하여 메시 출력 및 애니메이션을 한다.
- 대충 전체적인 큰 틀은 이렇습니다. 제가 Bone Animation을 하기 위해서 어떤것들을 이용해야 하는지 많이
막막했었는데.. 여러가지 방법들이 있었습니다.
X파일로 익스포트해서 사용할 수 도 있고 해골책에 있는 것처럼 max2xml 등을 이용하여 데이터 정보를 뽑아내서
이용하는 방법도 있지만.. 여러 사람들의 조언끝에 ASE를 사용해서 애니메이션을 하는 것이 가장 낫겠다라는 결정
을 하고 이것으로 진행하려고 합니다.
< ASE 파일이란 >
- 3DS MAX의 export 항목에 있는 (ASCII SCENE EXPORT)라는 파일 포맷 형식으로서 메쉬 및 애니메이션 정보의 대부분을
저장해 주기 때문에 분석하기 쉽게 텍스트 포맷으로 출력해주기 때문에 초보자들 및 기초를 튼튼히 하는데 큰 도움이 된다고
합니다.
< ASE 파일의 구조 >
- 먼저 max 에서 박스 하나를 만든 후 ase 파일로 export 한 후 다이렉트창으로 띄워 보는 것을 목표로 해보겠습니다.
- 3DS MAX 7 에서 현재와 같은 세팅으로 ASE파일로 export 한 것을 예를 들어서 진행하겠습니다.(추후에 MAX 버전은 바껴서 작업이 될 수 있으나.. 일단 7.0 버전에서 테스트를 해보겠습니다.)
*3DSMAX_ASCIIEXPORT 200 // 익스포터의 버전
*COMMENT "AsciiExport Version 2.00 - Fri May 02 15:25:54 2003"
*SCENE { // 모델 전체에 대한 정보
*SCENE_FILENAME "box.max" //max 파일 이름
*SCENE_FIRSTFRAME 0
*SCENE_LASTFRAME 100
*SCENE_FRAMESPEED 30
*SCENE_TICKSPERFRAME 160
*SCENE_BACKGROUND_STATIC 0.0000 0.0000 0.0000
*SCENE_AMBIENT_STATIC 0.0000 0.0000 0.0000
}
*MATERIAL_LIST { // 재질(Material)에 관련된 정보
*MATERIAL_COUNT 0 // 이 모델에 사용되는 Material의 갯수
}
*GEOMOBJECT { // 메시에 관련된 정보들
*NODE_NAME "Box01" // 메시의 이름,각 메시의 구별을 위해서 필요,계층구조를 만들때 유용
*NODE_TM {
*NODE_NAME "Box01" // 메시의 Transform Matrix에 관련된 정보
*INHERIT_POS 0 0 0
*INHERIT_ROT 0 0 0
*INHERIT_SCL 0 0 0
*TM_ROW0 1.0000 0.0000 0.0000 // 메시의 위치를 결정하는 TM을 읽어들인다. 4x4 행렬로 변환하여 읽어들임
*TM_ROW1 0.0000 -0.0000 1.0000
*TM_ROW2 0.0000 -1.0000 -0.0000
*TM_ROW3 -0.7663 11.3885 0.0133
*TM_POS -0.7663 11.3885 0.0133 // 메시의 이동값
*TM_ROTAXIS -1.0000 0.0000 0.0000 // 메시의 회전축과 회전값
*TM_ROTANGLE 1.5708
*TM_SCALE 1.0000 1.0000 1.0000 // 메시의 확대/축소값
*TM_SCALEAXIS 0.0000 0.0000 0.0000
*TM_SCALEAXISANG 0.0000
}
*MESH { // 실제 메시를 구성하는 점정과 Face에 관련된 정보들
*TIMEVALUE 0
*MESH_NUMVERTEX 8 // 구성된 정점의 개수
*MESH_NUMFACES 12 // 구성된 Face의 개수
*MESH_VERTEX_LIST { // 각 정점에 대해서 x,y,z의 순서로 저장
*MESH_VERTEX 0 -11.1111 11.3885 -11.4810
*MESH_VERTEX 1 9.5785 11.3885 -11.4810
*MESH_VERTEX 2 -11.1111 11.3885 11.5075
*MESH_VERTEX 3 9.5785 11.3885 11.5075
*MESH_VERTEX 4 -11.1111 -14.6651 -11.4810
*MESH_VERTEX 5 9.5785 -14.6651 -11.4810
*MESH_VERTEX 6 -11.1111 -14.6651 11.5075
*MESH_VERTEX 7 9.5785 -14.6651 11.5075
}
*MESH_FACE_LIST { // Face의 정보 순서대로 읽어들임,세정점의 index값, 마지막 값은 해당 Face가
// 어떤 서브 Material을 사용하는가를 저장. 서브 Material이 없으면 0
*MESH_FACE 0: A: 0 B: 2 C: 3 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 2 *MESH_MTLID 1
*MESH_FACE 1: A: 3 B: 1 C: 0 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 2 *MESH_MTLID 1
*MESH_FACE 2: A: 4 B: 5 C: 7 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 3 *MESH_MTLID 0
*MESH_FACE 3: A: 7 B: 6 C: 4 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 3 *MESH_MTLID 0
*MESH_FACE 4: A: 0 B: 1 C: 5 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 4 *MESH_MTLID 4
*MESH_FACE 5: A: 5 B: 4 C: 0 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 4 *MESH_MTLID 4
*MESH_FACE 6: A: 1 B: 3 C: 7 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 5 *MESH_MTLID 3
*MESH_FACE 7: A: 7 B: 5 C: 1 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 5 *MESH_MTLID 3
*MESH_FACE 8: A: 3 B: 2 C: 6 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 6 *MESH_MTLID 5
*MESH_FACE 9: A: 6 B: 7 C: 3 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 6 *MESH_MTLID 5
*MESH_FACE 10: A: 2 B: 0 C: 4 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 7 *MESH_MTLID 2
*MESH_FACE 11: A: 4 B: 6 C: 2 AB: 1 BC: 1 CA: 0 *MESH_SMOOTHING 7 *MESH_MTLID 2
}
// Face에 관련된 추가 정보들이 나열됨
*MESH_NUMTVERTEX 12 // 텍스쳐가 있는 경우 이 정보가 추가
*MESH_TVERTLIST {
*MESH_TVERT 0 0.0000 0.0000 0.0000
*MESH_TVERT 1 1.0000 0.0000 0.0000
...
}
*MESH_NUMTVFACES 12
*MESH_TFACELIST {
*MESH_TFACE 0 9 11 10
*MESH_TFACE 1 10 8 9
...
}
*MESH_NORMALS { // Face와 정점의 Normal 값. 각 Face에 속한 정점의 Normal값
*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
...
}
}
*PROP_MOTI[안내]태그제한으로등록되지않습니다-xx[안내]태그제한으로등록되지않습니다-xx[안내]태그제한으로등록되지않습니다-xxONBLUR 0
*PROP_CASTSHADOW 1
*PROP_RECVSHADOW 1
*WIREFRAME_COLOR 0.1098 0.1098 0.6941
}
- MAX 에서 간단한 박스 하나의 ASE 파일 형식에 대한 정보들입니다. 전체적인 구조는 생각보다 직관적으로 구성되어 있음을
알 수 있으며 크게 모델의 전체정보인 SCENE 정보와 메시의 정보(Material정보,Vertex 정보,Index 정보,TM 정보 )등으로 구성되어 있음을 알 수 있습니다. 이 정보들을 읽어들여 다음번에는 박스를 출력해 보도록 하겠습니다.