[ 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 @ 07.12.2007. 15:04 ] @
[ 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; } Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|