Autor Wątek: [C++]Ogre mieszanie animacji.  (Przeczytany 2238 razy)

Offline kokos22

  • Użytkownik

# Sierpień 06, 2012, 11:12:28
W jaki sposób ogre miesza animacje?Na czym polega wyznaczanie "ciężkości" animacji (weight) ?Jak uzyskać płynne przejścia pomiędzy animacjami ? I na czym polega hardware skining ?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline voytech

  • Użytkownik

  • +1
# Sierpień 06, 2012, 23:59:33
I na czym polega hardware skining ?
- hardware skinning polega na tym, że obliczenia do poruszania kośćmi odbywają się w vertex shaderze.

http://www.ogre3d.org/docs/manual/manual_76.html#SEC345 - ogólne info
http://www.ogre3d.org/docs/manual/manual_18.html#SEC109 - trzeba dodać jedną linijkę do pliku materiału, żeby ogre nie liczył animacji na cpu tylko przekazał kości w postaci macierzy do vertex shadera poprzez uniformy
http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Normal+Mapping+with+Hardware+Skinning+and+Specular&structure=Cookbook - a to jeden przykład z "code snipet" pokazujący jak się taki sprzętowy skinning robi

Na czym polega wyznaczanie "ciężkości" animacji (weight) ?Jak uzyskać płynne przejścia pomiędzy animacjami ?
jeżeli odgrywasz tylko jedną animację to waga równa jest 1. Teraz przypuśćmy, że postać biegnie 2s a potem idzie przez resztę czasu. Jeżeli przez 2s będziesz odgrywał animacje biegu po czym nagle ją zatrzymasz i zaczniesz odgrywać animacje chodu to będzie to brzydko wyglądać. Trzeba wstawić trzecią animacje od długości 0.5s, w której postać zwalnia.

Problem jest często taki, że takiej animacji brak, więc w przedziale 1.5s-2s oddziaływanie animacji biegu na szkielet jest zmniejszane poprzez zmniejszanie wagi od 0 do 1, natomiast waga animacji chodu jest zwiększana od 0 do 1. Zamiast funkcji liniowej można zastosować inną z łagodnym początkiem i końcem ale ogólnie zasada jest taka, że dla wag spełnione jest takie równanie:

weightanim1 + weightanim2 + ... + weightanimN=1

Łagodne przejścia się więc robi w ten sposób, że przez pewien krótki czas odgrywa się jednocześnie dwie animacje, z tym że pierwszej wagę się stopniowo zmniejsza do zera a drugiej zwiększa do 1

W jaki sposób ogre miesza animacje?
Nigdy tego w ogre nie robiłem ale pisze w info czarno na białym:
"Multiple animations can be applied to a mesh at the same time, again with a blend weighting"(http://www.ogre3d.org/docs/manual/manual_76.html#SEC345), więc może takie coś zadziała:
float t = 0.2; // [0.0-1.0]
AnimationState *anim;
anim = mEntity->getAnimationState("run");
anim->setEnabled(true);
anim->setWeight( 1.0-t );
anim = mEntity->getAnimationState("walk");
anim->setEnabled(true);
anim->setWeight( t );
wydaje mi się, że powinno takie coś zadziałać. Ogre powinien zmieszać animacje, które są włączone z uwzględnieniem wag a później dopiero przy ustawionym sprzętowym skinnigu wysłać wszystkie kości do szadera.

Offline kokos22

  • Użytkownik

# Sierpień 07, 2012, 10:11:57
Czy hardware skining da się wykonać bez użycia animacji szkieletowej, bo tą planuje wykorzystać do nakładania przekształceń na model i nie wiem czy nie będzie to ze sobą kolidować ?

Offline voytech

  • Użytkownik

# Sierpień 07, 2012, 13:21:56
Czy hardware skining da się wykonać bez użycia animacji szkieletowej
hee? Zawsze wydawało mi się, że skining animation i skeleton animation to w zasadzie to samo. Może chodziło ci o "Vertex Animation"? Masz tam dwa rodzaje, "Morph" czyli stare standardowe interpolowanie wierzchołków między dwoma kluczowymi klatkami oraz "Pose", które się bardziej nadaje do animacji twarzy. Zresztą wszystko jest w dokumentacji, warto też pooglądać "code snipet" (http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Snippets), może tam znajdziesz coś ciekawego