본문 바로가기

Programming/DirectX

애니메이션 4

귀차니즘과 더위에 지쳐 결국 오늘에서야 글을 쓰게 되었다.

후.. 사실 아무도 안 기다리는 것 같지만 그래도 시작을 했으면 끝을 봐야하기에.


일단 내가 만든 익스포터는 그 유명한


"맥스 스크립트"

(강조폰트컬러를 파란색으로 하기로 했다. 빨간색 강조는 더 더워보여서..ㅡ.ㅡ;;;)


로 만들어 졌다. 그것이 뭐냐!

그냥 맥스에서 지원하는 자체 스크립트일 뿐이다.


기능도 꽤 막강하고, 편리성이 강조되어있어서... 맥스 스크립트에 관해서는


http://www.3dstudy.net/


의 욘사마에게 여주어 봅시다.



익스포트 포멧명은 OSM이다. 왜 OSM인가 하면!

그. 냥.


진정하시라. 더이상 알려하면 다칩니다. 이번에 공개하는 것은 위에 적어놓은

http://www.3dstudy.net/ 에 공개한 1.0 버전에 약간 버전업 된 (그래봐야 버그패치좀 된 정도지만) 1.2 버전이다.


차이점은 1.0은 smd와 같은 방식인데 반해, 1.2는 약간 ase방식과 비슷해졌다.

무슨뜻인가 하면, 그냥 오브젝트별로 나온다는 거다.


이것은 내가 회사다닐때 제작한것이라서 회사에서 저작권 날라 태클러쉬를 넣으면 대략 난감한

사태가 발생할지도 모르지만, 일단 현재 그 회사는 게임산업 때려치기로 했고, 실제 익스포트는

이것이 아닌 다음 버전(구조가 많이 다르다.)으로 쓰고있으니 문제가 안될것이라 생각되지만...

소스는 대놓고 공개하지는 않겠다.


자 그럼 사설이 길었다. 일단 읽기 귀찮은 사람은 그냥 익스포트 받고 첨부파일확인해서 알아서

공부하시라. ( 사실 그게 추천이다. 내가 무슨 헛소리를 여기에 쓸지 나조차 알 수 없음. )


참고로 내 익스포트는 김용준님의 maxtoxml( 맞나? xmltomax였나.. )를 매우 많이 참고해서 만들었다. 그렇다고 마구 퍼가서 내가 만들었어요. 하면서 이력서에 포트폴리오로 넣으면


"천벌을 받을 지어다!"


몰랐는데 인터넷에서 돌고있는 자료를 살짝 수정해서 자기가 만들었다고, 이력서에 제출하는 사람

이더러 있다고 한다. 정말 그러고 싶은지... 아무리 하찮아도 남의 노력을 그렇게 낼롬 먹어치우면

 좋은가? ( 좋겠지. 후후후. )


으아 사설이 너무 길어~. 자자. 그럼 진짜로 해보자.


일단 파일타입은 smd와 같이 레퍼런스와 애니. 크게 두개로 나뉜다.

그러나 smd와 다른것은 애니에서 본애니와 버텍스 애니로 나뉜다는 것이다.

( 하지만 첨부된 로더에서는 버텍스애니는 지원안한다. 귀찮아서 안했다. 사실상 그때문에 버텍스애니는 잘 될거라는 보장도 없다...ㅡ.ㅡ )


일단 이 osm은 smd와 기본형태가 거의 유사하다. ( 일부러 그렇게 했다. )

그래서 애니와 레퍼런스의 차이는 매쉬 유무정도다. 나머지는 smd와 같이 같다 할 수 있다.


자 그럼 하나씩 해보자.

 

Version : [VERSION]

파일의 버전을 나타낸다. 그냥 무시해도 상관없을듯.

 

Node [Count]

[BONE_ID] [BONE_NAME] [PARENT_BONE_ID]

...

End

 

자 어디서 만이 본 구조 아닌가? 그렇다 SMD와 동일한 구조이다.

저위에 [Count]만 차이가 있을 뿐이다. 저것은 바로 smd의 단점 몇개인지 알수없는 문제를 해결하는 열쇠이다. SMD가 뭐냐고 하는 사람이 몇 보이는데..

내가 쓴 캐릭터 애니에서 스티칭 부분을 좀 보도록.( 사실 아무도 없다! )

 

Skeleton [Count]

time [FRAME_NUMBER]

[BONE_ID] [POS_X][POS_Y][POS_Z] [ROT_X][ROT_Y][ROT_Z] [SCL_X][SCL_Y][SCL_Z]

...

time [FRAME_NUMBER]

[BONE_ID] [POS_X][POS_Y][POS_Z] [ROT_X][ROT_Y][ROT_Z] [SCL_X][SCL_Y][SCL_Z]

...

End

자 역시 SMD의 그것과 똑같이 생겼다. time 애니메이션의 번째 프레임인지를 말한다.

물론 Reference 타입의 경우 항상 0이다. ( 당연한 것이다. SMD도 그렇다. )

자 매우 자주 해깔려서 매쉬를 괴수로 만들어버리는 부분을 보자.

이동, 회전, 확대 값은 해당 부모의 행렬 값을 누적시켜야 한다는 것. 곱하는 순서가 매우 중요하다는 것. 이라는 것이다. 자 밑의 공식을 보자.

 

- ResultMatrix: ChildMatrix(S * R * P) * ParentMatrix.


일단 모든 공식은 D3D공식으로 설명한 것이다. OGL이면 곱하는 방향은 반대방향

일 것이다.

저 그리고 로테이트 의 곱하는 순서도 중요하다.

RotX * RotY * RotZ 이것이다. 혹 맥스좌표가 D3D와 Z와 Y가 바뀌어 있다고

저 두값을 바꿔서 곱하는 바보짓을 하지 말자. 저것은 오일러회전이기때문에

전혀 성립되지 않는다. 화면에 괴수가 나올 뿐이다. 바꾸고 싶으면 방법은 있다.

저것을 행렬로 만든다음 쿼터니온으로 만들고, 그다음 쿼터니온의 값을 D3D값으로 변환시킨다음 다시 그것을 행렬로 만들면 된다.

(변환 방법은 (x,y,z,w) 정보를 (-x,-z,-y,w)로 치환시키면 된다. )

 

Material [Count]

[MATERIAL_ID] [MapFormat: “FileName”]

...

End

 

자 최초로 SMD에 없는 것이 나왔다.  Material 이라는 것이다. 저것은 차후에

수정하기에 따라서 많은 변화를 줄 수 있는 부분이다. 하지만 일단 현재는 단순

히 텍스쳐를 말하는 것 뿐이다. 그것도 Diffuse 맵 하나만.

SMD에서는 삼각형 하나에 사용될 텍스쳐가 하나 나와있는 형태를 모아서 메터리얼리스트로 만든 것이다. 로드에서 어떻게 하냐에 따라서 최적화하는데 보다 쉬워질 수 있다.

 

ObjectName [ [Object_Name] ]

Weight..

Mesh..

[End]

 

자 이것이 1.0버전과 달라진 부분이다. SMD에서도 없던 부분이라 할수있다.

(아 혹시 1.0버전을 구하고 싶다면( 설마.. ) 시작부분에서도 이야기 했지만, 욘사마의 홈페이지로 가보도록. 일단 거기에 공개했으니...)

일단 오브젝트 단위로 오브젝트 이름이 나온다. 일단 여기서 단점.

몇개의 오브젝트가 나올지 모른다. 일단 분명한 것은 노드수 이상은 안나온다는

것은 장담할 수 있다. ( 그게 뭐 어쩌라고.. )

일단 오브젝트 내부에는 이 익스포트의 핵심이라고 할 수 있는 Weight와 기본적인 Mesh가 포함되어있다.

그럼 계속보도록하자.

 

Weight [Count]

[Weight_ID] Count [Count]

        [BONE_ID] [BONE_NAME] [WEIGHT_VALUE]

        ...

[Weight_ID] Count [Count]

[BONE_ID] [BONE_NAME] [WEIGHT_VALUE]

        ...

End

 

자 이것이 Weight값의 정보다. 기본적으로 이 바로전 스키닝에서 설명한 웨이트

구조와 동일한 형태로 되어있다. 어떤식으로 값을 사용할지에 대해서는 바로 이전에서 이야기 했으니 넘어가도록하자.

 

Mesh [Count]

Time [FRAME_NUMBER]

Vertex [Count]

[0_Weight_ID] [X] [Y] [Z] [NX] [NY] [NZ] [U] [V]

...

Triangle [Count]

[0_Material_ID] [1_Vertex_ID] [1_Vertex_ID] [1_Vertex_ID]

...

Time [FRAME_NUMBER]

Vertex [Count]

[0_Weight_ID] [X] [Y] [Z] [NX] [NY] [NZ] [U] [V]

...

Triangle [Count]

[0_Material_ID] [1_Vertex_ID] [1_Vertex_ID] [1_Vertex_ID]

...

END

 

일단 Time은 버텍스 애니를 선택했을때 프레임 단위라 할 수 있다. 하지만 실제

잘 뽑힐지는 제작자인 나도 안해봐서 모른다. 그러니 될 수 있으면 하지 말자.

자 왠지 보기만해도 뭔지 알 수 있지 않은가? SMD와 다르게 버텍스가 정확하게

리스트화 되어있으며, 삼각형도 인덱스화 되어있다. 기본 버텍스 정보도 SMD에서 본 인덱스대신 웨이트 인덱스가 있다는 것만이 차이점일것이다.

 

이 익스포터에서 뽑는 버텍스 정보는 월드좌표계로 되어있다. 그뜻은 저 버텍스와 삼각형 정보만 가지고 그려도 캐릭터가 나온다.

이방식의 장점은 일단 익스포트 정보가 잘 됐는지 안됐는지 바로 확인이 가능하다는 것이다. 또한 스키닝하기에는 월드좌표계로 되어있는게 더 좋다.

(물론 이것은 나만의 생각이다. 태클 대환영. 나도 좀 알고싶다.)

 

자 이제 스키닝에 관한 모든 이야기를 했다.

다음에는 무슨 이야기 할지 나도 잘 모르겠다. 캐릭터 하면서 최적화에 관한 이야기를 할지, 아니면 다른 이야기를 할지는 날씨가 더우니 천천히 생각해보도록하고, 이 내용을 읽고 도움이 되었다면 격려의 편지라도 하나라도 써주면 고마..쿨럭쿨럭.

헛소리에 미안함을 금 할 수 없다. 마지막으로 살짝 강조한다면, 이 익스포터는

결코 완벽하지 않다. 스크립트를 해보면 알겠지만, 제법 이상한 놈이다.

그때문에 완벽한 구현이 되지 않았다. ( 핑계일 뿐..결국 또 다른놈을 만들었지만... ) 하여간 오류가 있으면 공부해서 고쳐보는 것도 좋다. ( 정신건강상 안하는 것이 좋을지도.. )

[출처] 캐릭터 애니메이션 4 - 자체 익스포터|작성자 샤르봉

'Programming > DirectX' 카테고리의 다른 글

애니메이션 1  (0) 2009.11.09
애니메이션 2  (0) 2009.11.09
애니메이션 3  (0) 2009.11.09
내적(dot product) 외적(cross product) 이용  (0) 2009.11.06
방향넣으면 각도 출력하는 함수  (0) 2009.11.06