Android Programjaim

Android fejlesztés, java, kotlin!!, anno 2010

Parser, parser, parser - keyframe animation opengl-es

2011. december 22. 13:27 - lacas82

Az engine bővült!!!

-normálisabb/gyorsabb .obj parser
-.3ds parser
-.md2 parser (animációk)

Tervek:
-esetleg md3, md5 parser
-esetleg egy ASE parser
-egy csontváz alapú file parser
-egy MS3D bináris parser

Tapasztalatok:
-.3ds file betöltése kicsivel gyorsabb, mint a .obj-é, és 2-szer annyi vertex van benne, mint obj-ban ugyanakkora méretben (3-4-szeres gyorsulás néha)
-.3ds file is tartalmaz elvileg keyframe animation-t
-.obj file nem tartalmaz semmilyen animációt, és text alapú, tehát lassú
-.md2 file (köszi Carmack) egész gyorsan betölt viszonylag sok animációs fázis
 --viszont: memóriahegyeket zabál, a folyamatos interpolációk miatt
 
UPDATE: videó!



Egy kis leírás a keyframe alapú animációkról (.3ds, .md2, stb)

Hogy működik kb.?
1, parse
-Az animátor/modellező letárol keyframe-eket, a megadott mozgásokból.
-ebből ugye lesz egy vertex array, egy normal array (vagy mi számítjuk ki), és textcoord array
-a szokásos parse után, felvesszük a frame-eket (hány db van?), majd a vertex arrayeket, normal arrayeket, és a textcoordokat, a face-eket
-a face-ek alapján sorrendbe állítjuk a koordinátákat, textcoordokat, normálokat

2, fps, frame-ek
-beállítunk egy fps-t, ha ez az érték nagyon kicsi akkor az interpoláció lassabban hajtódik végre, azaz lassabb mozgatás lesz az eredmény: (Matrix lassítás effect)
-ha ez az érték magas, akkor gyors lesz a mozgatás

-beállíthatjuk, hogy melyik legyen a kezdő frame, és a vég frame, ilyenkor ezek között végez a program interpolációt

példa: setState("walk", 20, 1, 10);

// ilyenkor létrehozunk a keyframe-ekből egy olyan frame groupot, amit "walk" néven nevezünk el. a 20= fps , az 1 a kezdő frame, a 10 pedig a vég frame

Ez esetben lehet, hogy a fileunkban van 200 frame is, de a többit figyelmen kívűl hagyjuk.

3, folyamatos interpoláció/rajzolás
Röviden:

A keyframe-ek tárolják az adott időpillanatban a vertexeket (egy statikus mozgásállapotot), ebből kell nekünk folyamatos *draw update alatt kiszámolnunk interpolációval a köztes rétegeket.

Azaz: az 1. és a 2. frame között pl lehet nekünk az interpoláció miatt az fps miatt 100 fázisunk. Ez annyit takar, hogy a mostani keyframe és a következő keyframe között számolunk vertexeket, és normalokat. A textúra koordináták ugyanazok maradnak!

Röviden ennyi!

Végszó:
-Sok memóriát zabál ez a fajta animáció, nem véletlen nem alkalmazzák olyan helyen, ahol számít! Inkább a bone/skeleton animációt használják ott, és az dinamikusabb is, mint ez a fajta animáció. Ezért csínján ezzel!

BOLDOG KARÁCSONYT GYEREKEK!

UI.: legközelebb egy kis csontváz animációról írok. Ez már keményebb lesz, mint az eddigiek.