Shader 21.12.08

김주현·2021년 12월 8일

셰이더

목록 보기
12/18

애니메이션

Mesh_Dynamic에서
D3DXLoadMeshHierracrchtFrmx의 마지막 인자로
LPD3DXANIMATIONCONTROLLER를 받는다.

애니메이션 컨트롤러 객체를 받아왔다.

이 친구를 이용해서 애니메이션을 재생한다.

이객체를 던져서 애니메이션을 관리하기위한 클래스만들자

CAnimation

애니메이션을 제어하는 역할을 한다.
몬스터의 원형을 하나 복제해서 여러개의 클론을 만들때
CAnimation을 복제하지않고 얕은복사로 나눠주면 모든 클론이 같은 애니메이션을 재생할것 -> 복사로 해주자.

Create의 인자로 장치와 애니메이션컨트롤러를 받자.
받은 두개의 Com객체를 멤버변수로 보관하자.

복제해줄것이니깐 네컨과 네컨_프로토 함수,Clone()함수만들어주자.

CAnimation의 복사생성자에서 pAnimationController를 깊은복사해주자.

애니메이션컨트롤러가 멤버변수로 CloneAnimationController를 제공해준다.(출력가능한 애니메이션의 갯수, 전체 애니메이션의 갯수,트랙의갯수,애니메이션이 재생될때 이벤트 프로시저는 몇개냐(안씀),어디에저장할것인지)
인자들을 애니메이션컨트롤러에서 Get함수호출을통해 꺼내서 넣어주자.
트랙을 하나 준비해놓고 애니메이션을 올린뒤 재생한다.
트랙을 두개 세팅해서 하나에선 공격모션을 하나에선 기본모션을해서 같이 돌려서 자여스러운 동작의 마무리를 만들수있다.

메시_다이내믹에 Animation.h를 include 해주자.

m_pAnimation을 멤버변수로 선언하고 장치와
로드메시에서 받아온 애니메이션컨트롤러를 넘겨줘서 CAnimation을 Create해서 보관해주자.

애니메이션 재생

HRESULT Play_Animation(_double Timedelta)으로 애니메이션을 재생해주자

멤버변수 m_pAnimation를 통해 애니메이션을 재생하자
재생을위해선 TimeDelta가 필요하다.

Set_AnimationIndex(_uint iAnimIndex)로 애니메이션을 Set해주자.

CAnimaion에 위 두함수를 만들어주자

PlayAnimation

멤버변수로보관한 애니메이션컨트롤러의 AdvanceTime(TimeDelta,nullptr);를 호출하면끝이다
(TimeDelta를 계속 누적하면서 시간에 맞는 애니메이션을 재생한다.)

(만들당시에 루트프레임에 접근해서 현재 애니메이션의 맞는값으로 뼈들의 트랜스폼값을 변경해준다.)

현재 뼈의 트랜스폼만바뀌었다 바뀐 트랜스폼을 이용해서 컴바인을 바꿔줘야한다.

Update_CombinedTranformationMatrices를 호출해주자.

SetAnimationIndex()

GetAnimationSet,GetAnimationSetByName 두 가지함수중에 골라서 사용할수있다.

LPD3DXANIMATIONSET pAS -> 애니메이션 셋이다.
위함수중에 하나를 골라서 인덱스(혹은 이름),애니메이션 셋을 넣어준다.

//트랙 위에 애니메이션 셋을 올려놓는다.
애니메이션 컨트롤러의 셋트랙애니메이션셋을 호출해준다.

이제 애니메이션셋은 필요없다 Safe_Release 해주자.

SetTrackEnable을 호출해서 트랙을 활성화시켜주자.

애니메이션 컨트롤러의 SetTrackPosition을 호출해서 트랙의 위치를 제일앞(0번위치)로 땡겨놓자.

메시다이내믹의 복사생성자에서 m_PAnimation을 복사생성해주자.

플레이어에서 애니메이션을 재생시켜주자.

FSM

m_iCurrentAniMation을 통해 중복적으로 Set해주지 않게 해주자.

뛰다가 멈출때 굉장히 어색하다.

m_iCurrentTrack과 NewTrack을 두자.

CAnimation의 셋 애니메이션인덱스에서 SetTrackAnimationSet을 할때 무조건 스트랙에 해준다.

m_iCurrent가 0이면 new트랙에 1을 아니라면 0을 넣어준다.

KeyTrackEnable로 트랙에 여유시간을 주고 멈춘다.

애니메이션이 바뀔대 기존 커렌트트랙은 0.2초간 살아있다.
뉴트랙도 활성 두트랙이 모두 활성화되어있다.
KeyTrackWeight트랙의 가중치를 설정해주자.(합쳐서 1)

m_TimeAcc를 만들고 타임델타를 똑같이 누적시키자.이를 KeyTrackWeight함수의 스타트타임으로 주자.
0.2 -> 활성시간 의미
D3DXTRANSITION_LINEAR -> 선형보간해라.

KeyTrackSpeed도 호출해주자

m_iCurrentTrack을 뉴트랙으로 바꿔주자.

m_pAniMationController->ResetTIme()으로 시간을 리셋해주고.
m_TitmeAcc도 0으로 해주자.

처음에 UnKetAllTrackEvents로 이벤트를 모두 꺼버리자.

한개의 애니메이션이 끝나는건 어떻게알까?
SetTrackAnimationSet로 얻어오면 pAs->GetPeriod로 끝나는 시기를 얻어오고 CurrentTrack의 Desc를 얻어와서 비교해주자.

0개의 댓글