본문 바로가기

프로그래밍 -----------------------/C,C++ 팁

ase 애니부분 파싱하다가 .. -_-;; 불펌했다 ㅎㅎ;;



안녕하세요 볼따구 입니다.

ASE파일에 대한 정보는 아마, 질문&답변 공지에 있는 예전 네띠앙 게시판 백업 받아놓은곳에서
검색하면 몇가지 힌트를 얻지 않을까 싶네요

답변을 다시하는것보다 찾은 내용이 더 좋아서 올립니다.;; 양해 부탁요
TICKPERFRAME 에 대한 설명입니다.
--------------------------------------------------------------------------------------
*CONTROL_POS_SAMPLE 0 -2.3379 12.9396 0.0000
*CONTROL_POS_SAMPLE 160 -8.5171 14.5598 0.0000
*CONTROL_POS_SAMPLE 320 -14.5706 16.1447 0.0000
*CONTROL_POS_SAMPLE 480 -20.4982 17.6944 0.0000
*CONTROL_POS_SAMPLE 640 -26.3000 19.2089 0.0000
...

여기서 첫번째 인자는 프레임 입니다.
이것을 잘 보시면 160씩 올라가구 있지여.. 이것을 우리가
사용하는 0, 1, 2 .. 이런식으로 바꾸는 방법은 간단합니다.


ASE파일에 보시면
*SCENE {
*SCENE_FILENAME ""
*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
}

이부분이 있을겁니다. 여기의 정보를 잘 보시면 알겠지만

// 0번 프레임부터 시작
*SCENE_FIRSTFRAME 0

// 100번 프레임까지 입니다. 즉.. 101프레임짜리가 되겠군여
*SCENE_LASTFRAME 100

// 초당 30프레임이구여
*SCENE_FRAMESPEED 30

// 이부분은 아래의 Tick 설명을 보시면 알겁니다.
*SCENE_TICKSPERFRAME 160


////////////////////////////////////////////
Tick

Tick은 소프트웨어가 시간의 증가량을 고려하는 방법입니다. 1초에는 4800 Tick이 있습니다. 따라서 실제로 접근할 수 있는 시간의 단위는 1/4800초 입니다.

기본으로 주어진 NTSC 비디오의 프레임 레이트가 초당 30프레임이므로 한 프레임은 160 Tick입니다.

화면 표시 형식으로 FRAME:TICKS를 사용하면 시간을 프레임과 Tick 단위로 보여줍니다. 이 형식은 타임 슬라이더를 1/160 프레임의 하위 프레임 단위로 조절할 수 있게 해줍니다. 시간 사이를 왔다 갔다 하면 Tick 칸은 0에서 159까지 증가하다가 프레임 칸이 1만큼 증가하고 Tick은 다시 0으로 되돌아갑니다.

재생 버튼의 단일 프레임 버튼을 클릭하면 Tick 단위로 앞 뒤로 이동할 수 있습니다.

화면 표시 형식으로 MM:SS:TICKS을 사용하면 시간을 분(MM), 초(SS), Ticks으로 볼 수 있습니다. 각 단위는 콜론으로 나누어집니다.

이 화면 표시 형식에서 시간 사이를 왔다 갔다 하면 Tick 칸은 0에서 4799까지 증가하다가 두 번째 칸이 1만큼 증가하고 Tick은 다시 0으로 되돌아갑니다.

재생 버튼 양쪽의 단일 프레임 버튼을 클릭하면 Tick 단위로 앞 뒤로 이동할 수 있습니다.
////////////////////////////////////////////////////////

그럼

*CONTROL_POS_SAMPLE 480 -20.4982 17.6944 0.0000

이것은 몇번째 프레임 일까여?
간단합니다.
480 / 160 = 3

결과는 3프레임이네여 이런식으로 바꿔주시면 됩니다.

특별하지는 않구여 첫번째 인자는 프레임단위를 말하는겁니다.
----------------------------------------------------------------------------------------------
위에 원본 주소 입니다.
http://cgi-svr.netian.com/cgi-bin/Janus-user.cgi?cmd=read&index=pro&owner=proline1&ini=&arg=1435&up=2969&flt=tb&fag=TICK&incdel=


일단 ASE파일에서 넘오오는 애니메이션 값은 쿼터니온이 아닌 위치 회전값입니다.
뭐 어떤걸루 뽑는가에 따라서 다르겠지만요, SAMPLE로 뽑았다고 할때 사용설명입니다.
----------------------------------------------------------------------------------
계층구조의 애니메이션은 주의 할점은
먼저 자식은 부모의 애니메이션에 영향을 받고 또한
자신의 애니메이션에 영향을 받는다는 겁니다.

즉 자식의 경우는 부모의 애니메이션과 자신의 애니메이션을
더한 애니메이션을 해야 합니다.

ASE 플러그인의 소스를 보시면 알겠지만..
CONTROL_ROT_SAMPLE 를 뽑아줄때 기본적으로 쿼터니온으로
나오는 데이타를 다시 ROTAXIS,ROTANGLE 바꿔서 출력하는
이상한 짓을 합니다. ㅡㅡ;

먼저 여기서 주의할점은 Rotaxis값의 y,z의 값을 바꿔줘야
합니다.
> ............ 0 0.0000 0.0000 1.0000 0.0611
> ............ 2400 -0.9981 0.0610 0.0000 0.0002
그리고 1플레임 단위는 보통맥스에서 160 단위인데..
위와 같이 1600 단위로 나올수도 있습니다.

즉.. 0 1600 2400 ... 이렇게 데이타가 있어야 합니다.
위에 경우는 1600이 없으므로 상위 데이타를 복사합니다.

따라서 아래와 같이 복원해야 합니다.( y, z를 바꿉니다.)
> ............ 0 0.0000 1.0000 0.0000 0.0611
> ............ 1600 0.0000 1.0000 0.0000 0.0611
> ............ 2400 -0.9981 0.0000 0.0610 0.0002

또한 그냥 사용하시면 안됩니다.
먼저 쿼터니온으로 바꿉니다.
D3DXQuaternionRotationAxis(); <- 8.0 함수

그리고 중요한것은 누적을 시켜야 합니다. 즉
0의 데이타는 그대로 가지마 1600의 경우는 0*1600 이고
2400의 데이타는 (0*1600)*2400 이렇게 됩니다. ..
계속 누적을 시켜야 합니다.
D3DXQuaternionMultiply(); <- 이 함수를 사용하세여
이때 주의할점은 왼쪽에 누적데이타냐 오른쪽에 누적데이타냐
에 때라 달라질수 있으므로 주의 하세여..

이것은 테스트해보면 알겁니다.
반대로 곱하면 애니메이션이 요상하게 나옵니다.

나중에 사용할때는 쿼터니온을 다시 매트릭스로 바꿔서
사용해야 합니다.
-------------------------------------------------------------------------------------------
위에 원본 주소 입니다.
http://cgi-svr.netian.com/cgi-bin/Janus-user.cgi?cmd=read&index=pro&owner=proline1&ini=&arg=234&up=2292&flt=tb&fag=Quaternion&incdel=


원하시는 답변이 맞는지 모르겠네요
D3DXQuaternionSLerp를 사용할 경우는 예를 들어 20.5 프레임이 나왔다고 할때
20프레임과 21프레임의 중간 쿼터니온을 구하기 위해서 사용합니다.
즉, 다시 말해서 20프레임의 누적 쿼터니온을 구하고, 21프레임의 누적 쿼터니온을 구한다음에
위에 함수를 사용해서 중간 쿼터니온을 얻는것이지요

일단 애니메이션을 하기 위해서는 충분히 계층구조에 대해 이해를 하셔야 합니다.

'프로그래밍 ----------------------- > C,C++ 팁' 카테고리의 다른 글

행렬(Matrix)  (0) 2008.10.13
3D 세계를 구성하는 필수 요소들 | [펌]DirectX  (0) 2008.10.13
DirectX 용어집  (0) 2008.10.13
4*4행렬 회전  (0) 2008.10.13
내적 외적  (0) 2008.10.13