[ glorius @ 07.12.2007. 15:04 ] @
Da li znate gde postoji neki tutorial koji konkretno objasnjava tranzicije skeletalnih animacija pomocu traka animacije?

Pretrazih pola sveta :) Nemaaaa!
[ glorius @ 08.12.2007. 11:56 ] @
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;

}