Igrao sam se fa funkcijama animation controllera i skapirah tranzicije....
Evo ako nekog zanima objasnjenje funkcija:
Tranzicija ( i ostali efekti ) se rade pomocu 2 ili vise traka animacije ( kao u Adobe Premier-u kada imate dve trake animacije pa se polako pretace iz jedne u drugu )
1. ID3DXAnimationController::SetTrackEnable( UINT traka, BOOL bEnable ) - ukljucujemo traku gde zelimo da ubacimo animaciju
2. ID3DXAnimationController::KeyTrackEnable( UINT traka, BOOL bEnable, double startTime ) - ova funkcija omogucava da se traka ukljuci ili iskljuci ali u nekom apsolutnom vremenskom trenutku koji je oznacen startTime vrednoscu
Primer:
KeyTrackEnable(0, FALSE, currentTime + 10) - Traka ce se iskljuciti za 10 'vremenskih jedinica (VJ)' racunatih od trenutka pozivanja ove funkcije... ( ovo je korisno kada se vrsi tranzicija iz 1. u 2. animaciju... posle tranzicije nam treba samo 2. animacija... onda cemo iskljuciti 1.... ali, prvu iskljucujemo tek posle procesa tranzicije koji, u nasem slucaju, traje 10 VJ.
3. ID3DXAnimationController::KeyTrackSpeed( UINT traka, double novaBrzina, double startTime, double duration, D3DXTRANSITION_TYPE tipTranzicije) // ova funkcija se koristi da bi se animacija u nekom vremenskom periodu ubrzala ili usporila
- novaBrzina: Svaka animacija ( koja je predstavljena ID3DXAnimationSet interfejsom ) ima svoju brzinu. Ova funkcija podesava novu brzinu koja ce se postaviti animaciji koja je postavljena u ovu traku ali, ta brzina nece trenutno da bude postavljena vec ce se povecavati ili smanjivati ( linearno ili smooth - zavisi od D3DXTRANSITION_TYPE promenljive ) u nekom vremenskom periodu koji je odredjen promenljivom duration.
Primer: pretpostavimo da je trenutna brzina animacije 1. ( Brzina se postavlja u ID3DXAnimationSet promenljivoj - pogledajte u finalnom primeru )...
Mi zelimo da nam brzina animacije polako usporava od 1 do 0 za 5 VJ. ( Korisno je kada se lik u igri krece i vi onda otpustite dugme i on jos uvek malo ide ali usporava i na kraju staje )
KeyTrackSpeed( 0, 0, currentTime, 5, D3DXTRANSITION_LINEAR );
4. ID3DXAnimationController::KeyTrackWeight( UINT traka, double noviWeight, double startTime, double duration, D3DXTRANSITION_TYPE tipTranzicije)
Slicno kao i sa prethodnom funkcijom samo sto se umesto brzine podasava weight animacije. Ako imamo 2 animacije i 1. je weight = 1 a 2. weight = 0, samo ce se prva izvrsavati
1. w = 0.5
2. w = 0.5
U ovom slucaju ce se animacije mixovati
1. w = 0
2. w = 1
U ovom slucaju se izvrsava samo druga animacija.
Ovo je korisno za smooth tranziciju iz jedne u drugu animaciju u nekom vremenskom periodu koji je odredjen duration promenljivom.
PRIMER: Podesavanje animacije bez tranzicije ( cista loop animacija )...
Code:
void CActor::SetCurrentAnim(string strCurrAnim)
{
m_dwCurrTrack = 0; // podesavamo trenutnu traku animacije ( kada imamo jednu animaciju, uvek koristimo prvu traku... )
LPD3DXANIMATIONSET set;
controller->GetAnimationSetByName(strCurrAnim.c_str(), &set);
controllerSetTrackAnimationSet(m_dwCurrTrack , set);
controller->SetTrackEnable(0, TRUE); // ukljucujemo prvu traku
controller->SetTrackEnable(1, FALSE); // iskljucujemo drugu traku jer nam, za sada, ne treba
controller->SetTrackSpeed(m_dwCurrTrack , 1); // brzina animacije = 1
controller->SetTrackPosition(m_dwCurrTrack , 0.0); // animacija krece od pocetka
controller->ResetTime(); // moze i ne mora da se resetuje globalno vreme animacije
SAFE_RELEASE(set);
}
PRIMER: Blendovanje 2 animacije ( prelaz iz, npr, trcanja u stajanje )
Code:
void CActor::Blend(string newAnimName, double duration)
{
// radimo sa dve trake. Jedna je uvek 0 a druga 1.
DWORD newTrack = !m_dwCurrTrack;
// nalazimo animaciju sa kojom se trenutna animacija blenduje
LPD3DXANIMATIONSET set;
controller->GetAnimationSetByName(newAnimName.c_str(), &set);
// postavljamo novu animaciju u drugu traku
controller->SetTrackAnimationSet(newTrack, set);
// resetujemo sva prosla podesavanja kljuceva za tranziciju za obe trake koje koristimo
controller->UnkeyAllTrackEvents(0);
controller->UnkeyAllTrackEvents(1);
controller->UnkeyAllPriorityBlends(); // ovo je vezano za prioritet animacija. pogledajte u uputstvu za anim controller:)
// pomocu ove 3 funkcije usporavamo trenutnu animaciju, postavljamo weight na 0 i na kraju je iskljucujemo i sve to se desava za 'duration' vreme
controller->KeyTrackEnable(m_dwCurrTrack, FALSE, m_dTimer + duration); // m_dTimer je promenljiva koja nam odredjuje apsolutno proteklo vreme
controller->KeyTrackSpeed(m_dwCurrTrack, 0, m_dTimer, duration, D3DXTRANSITION_LINEAR);
controller->KeyTrackWeight(m_dwCurrTrack, 0, m_dTimer, duration, D3DXTRANSITION_LINEAR);
// ukljucujemo novu traku odmah ali brzina i weight se polako uvecavaju da bi doslo do fine tranzicije
controller->SetTrackEnable(newTrack, TRUE);
controller->KeyTrackSpeed(newTrack, 1, m_dTimer, duration, D3DXTRANSITION_LINEAR);
controller->KeyTrackWeight(newTrack, 1, m_dTimer, duration, D3DXTRANSITION_LINEAR);
// animacija u novoj traci bi trebala da pocne od pocetka
controller->SetTrackPosition(newTrack, 0.0);
// trenutna traka nam je sada nova traka
m_dwCurrTrack = newTrack;
}
EOF