본문 바로가기

Programming/DirectX

애니메이션 2

첫번째 글에서 나는 본애니의 기본적인 방법에 관해서 이야기 했다.

그때 본애니에서는 스티칭 애니와 스키닝 애니  두개가 있다고 한 기억이 있다. ( 없나? )

뭐 하여간 오늘은 스티칭 애니의 대표적인 파일포멧인 SMD에 관해서 살짝 이야기 하겠다.

잠시 스티칭 애니에 관해서 살짝 이야기 하고 가겠다.


스티칭 애니는 점 하나에 본하나가 영향을 주는 형태를 말한다.

그때문에 관절부분이 애니때 접힌다면, 뽀족하게 될 소지가 높다.

하지만 버텍스하나에 매트릭스 하나이기에 속도는 빠르다.

(그림정보를 찾으려다 귀차니즘의 압박으로 그만두도록하자. 뭐 보는 사람이 있을지도 의문이니...)


참고로 SMD로 본애니를 공부했지만, 의외로 국내에서 SMD를 쓰는 사람과 회사들이 많다는거다.

( 뮤가 SMD로 만들었다....신기할 따름이다. )

SMD는 벨브사가 하프라이프 SDK를 공개하면서 같이 공개된 포멧이다.

( ...아닌가? 분명 벨브사가 만든것만은 분명하다. )


SMD의 장점은 군더더기가 없는 매우 명료한 정보들만 가지고 있다는 것이다.

그때문에 단점은 너무 군더더기가 없어서, 몇개가 있는지조차 가르쳐주지 않는다는거다.

( 본의 갯수라던가, 삼각형의 갯수등등... )


MOD파일을 보면 SMD말고 해더성 정보파일이 하나더 있는데, 그런식으로 관리하려고 뺀듯하다.


SMD의 자료구조는 크게 3부분으로 나뉜다.

본노드 / 스켈레톤 정보 / 매쉬 정보


이런 정보를 가지는 SMD는 두가지 포멧으로 나뉘어진다.

레퍼런스와 애니메이션.


레퍼런스에는 위의 3가지 자료구조를 모두 가지고 있다. 말그대로 레퍼런스로서 본과 본정보,

그리고 매쉬가 존재하는 것이다.


애니메이션은 위 3가지 정보중, 매쉬정보가 빠져있으며, 스켈레톤 정보가 프레임수만큼 나와있다.

여기서 살짝 smd를 보자.


version 1
nodes
  0 "Bip01"  -1
  1 "Bip01 Footsteps"   0
  2 "Bip01 Pelvis"   0
  3 "Bip01 L Leg"   2
  4 "Bip01 L Leg1"   3

  ....


skeleton
time 0
  0 0.000000 -0.000000 39.526119 0.000000 0.000000 -1.570795
  1 0.000000 0.000000 -39.332325 0.000000 0.000000 1.570795
  2 0.866404 0.000000 0.000000 -1.570795 -1.570796 0.000000
  3 -0.000005 0.000007 3.713254 0.002054 3.115505 -0.021473
  4 18.045723 -0.000000 -0.000000 0.000000 -0.000000 -0.121501

  .....


triangles
PLAYER_Chrome1.bmp
 20   6.2915   3.6852  58.7875   0.7828   0.5264   0.3317   0.0137   0.2611
 44   5.8005  -1.2928  62.2638   0.1754   0.2434   0.9539   0.0948   0.4558
 44   7.4334   2.4543  59.8983   0.1717   0.8248   0.5387   0.0317   0.3338
PLAYER_Chrome1.bmp
 19   3.9185   3.2071  51.5657   0.6297   0.6813  -0.3732  -0.1638   0.3040
 44   7.4334   2.4543  59.8983   0.1717   0.8248   0.5387   0.0317   0.3338
 44   8.0542   2.2868  54.9256   0.5291   0.7574  -0.3827  -0.0604   0.3564
PLAYER_Chrome1.bmp
 56  -7.4701   2.4393  59.9100  -0.2332   0.7523   0.6162   0.4673   0.3301
 56  -6.0121  -1.2665  62.3253  -0.1773   0.0557   0.9826   0.4038   0.4548
 20  -5.6520   1.8873  62.6681  -0.8312   0.0346   0.5549   0.3928   0.3307
 .....


이것이 바로 SMD의 파일구조다.

Nodes가 바로 본의 구조를 나타낸다.


  0               "Bip01"       -1

자신인덱스    본이름       부모인덱스


이런 형태로 본(트리)구조를 알려준다. 뭐 더이상 설명이 필요없을듯 하다.


다음은  skeleton


time 0   <- 레퍼런스라면 time 0 만 존재하지만 애니매이션이라면 애니 프레임수만큼 나올것이다.


  0                 0.000000 -0.000000 39.526119  0.000000 0.000000 -1.570795
자신인덱스    |-----부모의 상대위치------||-----오일러 X Y Z 회전----|


이 정보가 바로 실질적인 본의 매트릭스 정보를 말해준다.

1에서 이야기 했듯이 본노드는 부모로부터의 상대TM을 갖는다고 했다.

저정보들은 모두 부모로부터의 상대값만 가지고 있다. 위치도 회전도 말이다.

저 정보를 매트릭스화 할때 주의할점이 있다. 바로 곱하는 순서다.

저 정보를 매트릭스로 만드는 것을 잘 알고 있을것이다.

부모의 상대위치를 T라 하고 오일러 X Y Z는 각각 Rx RY Rz 라 할때 곱하는 순서는

Rx * Ry * Rz * T 순이다.

참고로 저 순서는 D3D에서의 순서다. OGL이라면 반대로 T * Rz * Ry * Rx 이다.

또한 오일러 회전의 각 축의 각도는 라디안 값이니 OGL이라면 다시 각도로 변환시켜야 할 것이다.

( OGL는 회전을 각도로 받고 D3D는 라디안 값으로 받는다. )

저렇게 해서 만들어지는 저 노드의 자기 TM이다.

부모가 있을때는 자기TM * 부모TM 순으로 곱해야 한다.

( 역시 OGL이라면 반대로 부모가 앞에 온다. )


이제 마지막 triangles


PLAYER_Chrome1.bmp  <- 이 삼각형이 사용하는 텍스쳐명이다.


아래 순서대로 삼각형을 구성한다.
 20   6.2915   3.6852  58.7875   0.7828   0.5264   0.3317   0.0137   0.2611
 44   5.8005  -1.2928  62.2638   0.1754   0.2434   0.9539   0.0948   0.4558
 44   7.4334   2.4543  59.8983   0.1717   0.8248   0.5387   0.0317   0.3338

자 이제 점정보를 보자.

 20                 6.2915   3.6852  58.7875   0.7828   0.5264   0.3317   0.0137   0.2611
영향본인덱스   버텍스 x y z                   노멀 x y z                    텍셀 u v


위에서 스티칭 애니는 하나의 본에 영향을 받는 구조라고 말했다.

버택스 하나가 본하나에 1:1 매칭된다는 것은 속도가 빠르다.

물론 스키닝 애니에 비해서일뿐이다. 순수 버택스 애니에 비하면 느릴수밖에 없다.


자 일단 SMD에 관해서 설명을 했다. SMD설명을 봐서 알겠지만, 처음에 말했듯이

뭐가 몇개있는지에 대한 정보가 전혀없다. 따라서 SMD를 읽어서 쓸때는 약간의

최적화가 필요하다.

첫번째가 텍스쳐, 같은 이름의 텍스쳐는 같은 텍스쳐인것이 당연하다.

두번째가 버텍스 인덱스화. 저래보여도 중복되는게 꽤 존재한다.


자 그럼 오늘은 여기까지.

보고 도움되는 사람이 있을지 의문이다. ( 보는 사람이 있는지도 의문이다. ㅡ.ㅡ )

그럼 오늘도 안녕히.



ps : 라이트맵이 싫어진다.

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

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