반응형

http://blog.naver.com/patori/90033021950




 

그동안 미뤘던 애니메이션 공부를 다시 하게 됐다.

 

DirectX에서 지원하는 함수로 X파일을 그냥 로드하려고 했는데,

예제 Sample이 훨 어렵다. MS사에서 진정 이걸보고 예제로 쓰라는건지가 의심스럽다.. 

 

어쨌든 일단 예전에 봤던 김용준님의 저서 3D 게임 프로그래밍에서 봤던 xml부터 다시 공부하기로 했다.

xml 코드가 보기도 쉽고 체계적으로 잘 되어 있어서 포맷 공부하기엔 딱인듯 하다.

나중에 MaxScript를 만질 기회가 생긴다면 포맷도 새로 만들수도 있겠다. (먼산) 

 

------------------------------------------------------------------------------------------------------

 

<Body>에서 <Info>, <Material>, <Object>로 크게 갈라진다.

<Info>: 최초로 읽어 들일 때, 전체적으로 가지고 있는 기본 정보가 들어있다.

<Material>: 메터리얼 정보를 가지고 있다.

<Object>: 메쉬와 본, 바이패드 등의 상세 정보를 담고 있다.

 

 

<Info>

 

일단 Info의 정보를 살펴보면 위에서부터 차례대로,

파일이름, 오브젝트 수, 메쉬 수, 애니메이션 프레임 크기, 키 타입, <Object>, <Bone>이 있다.

여기서 오브젝트 수는 <Object>의 총 개수이겠거니 했는데, 정확히 맞지 않는다.

나중에 파싱할 때 이부분은 다시 교체한다.

<info>에서  접혀진 부분에는 이런 값이 들어있다.

 

 

<Bone>에서 BoneID와 ID가 있는데 BonID는 뼈대 개수만큼 있고,

ID는 해당 본의 실제 Object ID를 말한다.

위의 그림에서  BoneID가 1인 Bip01은 Object ID가 7이라는 것을 알 수 있다.

 

여기까지가 <info> 부분이다.

 

 

<Material>

 

메터리얼은 텍스쳐, 광원 등의 재질 정보다.

 

 

<Material>의 개수는 <Slot>의 Index 최종값+1이다.

<Slot>안에서 Material에 대한 정보를 기록한다.

<Diffuse><Ambient><Specular><Emissive><Opacity><Power>는 필수 정보이고,

그 이후의 <DiffuseMap><NormalMap><BumpMap>은 사용된 텍스쳐 종류에 따라 추가된다.

 

 

<Object>

 

가장 데이터 양이 많은 Object부분이다.

해당 Object에 해당하는 모든 정보를 저장하고 있다.

 

 

일단 여기서 Class를 유심히 보아야 한다. 이 Class는 3ds Max에서 이미 정해진 클래스이다.

Class의 종류는 4가지 이다.

 

 

 

Dummy : 더미 클래스로  아무 일도 안하지만, 바운딩 박스와, 위치 정보를 가지고 있다.

              계층적으로 본과 바이패드를 분리할 때, 각각의 계층을 대표하는 정보를 가지고 있다.

Editable_mesh : 메쉬에 해당하는 부분으로 메쉬를 표현하기 위한 모든 정보가 들어있다.

 

Dummy + Editable_mesh 수가 <Info>의 MeshCount 수와 같다.

 

BoneGeometry : Bone에 대한 정보를 가지고 있다.

Biped_Object : 바이패드 정보를 가지고 있다.

이 두 클래스는 상당히 유사하다.

 

클래스별로 세부 내용이 다르고, 그 중 Editable_mesh 와 BonGeometry & Biped_Object 로 크게 분류할 수 있다.

 

Editable_mesh

 

 

여러 섹션중에 가장 많은 정보를 담고 있다.

Parent, Local, World, BoundingBox는 4클래스 모두 공통으로 가지고 있다.

Parent는 계층분류에 사용되고 Editable_mesh에서는 -1(부모를 소유하지 않음)로 설정된다.

그 아래 부분부터가 Editable_mesh의 고유 영역이다.

 

<Vertex> : 버텍스 좌표를 담고 있다.

 

<VertexNormal> : 법선 벡터

 

<TriIndex> : 삼각형 Index 정보를 가지고 있고, index 번호는

                 <Vertex> 안에서 지정된 Index가 사용된다.

 

하나의 메쉬 안에서 여러개의 Material을 설정할 수 있다.

TriIndex의 MaterialCount는 Material의 개수를 담고 있는데,

나중에 파싱할 때에는 하나의 메쉬에 하나의 재질만 가질 수 있도록 분할하는 작업을 하게 된다.

그래야지 나중에 출력 루프가 간편해진다.

일단 여기서는 해당 2번 재질이 사용된 것을 알 수 있다.

 

<TexVertex> : 인덱스 u,v 좌표를 담고 있다.

<TexIndex>  : <TriIndex>와 비슷한 형식으로 대신 TexVertex에서 지정한 인덱스를 기준으로 지정된다.

 

<VertexWeight> : 스키닝에 필요한 각각의 정점 가중치를 지정한다.

 

BoneCount는 해당 Mesh가 스키닝을 위해 참조하는 뼈대의 개수를 저장하고

Vertex를 Index순으로 차례대로 나열하면서 관련된 뼈대의 ID와 가중치를 저장한다. 

 

 

하나의 Vertex당 뼈대는 최대 4개까지 지정할 수 있다.

나중에 계산을 할 때

VResult = VLocal * ( MSkinning0 * MWeight0 + ... + MSkinning3 * MWeight3)  

이런 식으로 계산을 하게 되는데, 관련된 뼈대 개수가 많아지면 행렬 연산이 상당히 많아지므로

최대 4개까지로 지정해 두었다. Bone에서 MSkinning을 구하는 과정까지의 행렬계산 부분도 많기 때문에

어쩔수 없다.

(팔레트 테이블을 사용하거나 버텍스 셰이더를 사용하면 GPU에서 계산을 처리하게 되서 속도를 향상시킬 수 있다.)

 

가중치는 합이 1.0이 되고, 필요에 따라서는 클 수도 있다.

 

BonGeometry & Biped_Object

 

본과 바이패드는 애니메이션에 관한 정보를 담고 있다.

 

 

부모 ID에서 상위 계층 ID를 지정하게되고 나중에 Animation 변환 행렬을 설정할 때

부모의 최종 변환 행렬을 곱해서 최종 Animation 변환 행렬을 구할 수 있다.

 

<Key>안에는 3가지 섹션이 있다.

 

<Position> : 지정된 프레임의 순간 위치 좌표가 설정된다.

 

<Quaternion> : 프레임당 회전량을 쿼터니온으로 표현하였다.

                      쿼터니온은 이전에 기록된 프레임(5frame경우는 0frame)이후의 상대값으로

                      저장되기 때문에 파싱후에는 차례대로 누적을 해서 값을 갱신시켜줘야 한다.

 

<Scale > : 확대/ 축소 비율을 나타낸다.

 

 

------------------------------------------------------------------------------------------------------

 

이렇게해서 기본적인 xml분석은 오와리!

 

반응형

+ Recent posts