Ismét elérkezett az idő, hogy foglalkozzam a csontanimmal. Szerencsére a formátumom még mindig megállja a helyét, a kódom 90%-ban újrahasznosítható volt tehát a md5mesh/md5anim importáló gyorsan a rendelkezésemre állt.
Első dilemma
Azt mindenki tudja, hogy adott frame-hez tároljuk a csontok térbeli pozícióját és orientációját. Ennek azonban két változata lehetséges: mátrix alapú (későbbiekben M) ill. kvaternió + pozíció (későbbiekben QP) alapú. Az előbbi 12 floatot jelent az utóbbi 7 floatot. Interpoláláskor jelentkeznek a jelentős különbségek: M esetben egyszerű lineárisan interpolálni viszont az eredményt újranormalizálni kell. QP esetben - ami az ajánlott eset is - 3 floatot kell lineárisan interpolálni, a kvaterniót azonban szférikus-lineárisan kell interpolálni (avagy SLERP). A SLERP az első kritikus rész az animációban vagyis érdemes a SLERP implementációjára egy gyors megoldást keresni.
Második dilemma
Második kritikus rész a csont-vertex transzformálás. Ennek központi eleme, amikor adott vertexre alkalmazzuk a rá ható csontok QP-ját. Itt is két módszer lehetséges: közvetlenül a QP-t alkalmazzuk a vertexre vagy előbb a QP-t átalakítjuk mátrixszá. Tapasztalataim szerint az utóbbi a hatékonyabb. Megfigyelhető, hogy általánosságban gyakori az az eset amikor egy vertexre csak egy-kettő-három csont hat. Ezeket az eseteket külön érdemes kezelni, mert ez is sebesség kritikus rész.
Harmadik dilemma
A harmadikus kritikus rész már a rendereléshez tartozik. Tapasztalom szerint a vbo dupla bufferelése az esetek többségében nem kifizetődő - csak akkor mértem sebesség növekedést, ha legalább 4x rendereltem ugyanazt a modellt.
Konklúzió
Célszerű megoldani, hogy az adott animációs fázisban lévő modellt újrahasznosítsuk: rengeteg számolást spórolhatunk valamint nagyobb eséllyel kihasználhatjuk a dupla bufferelt vbo előnyeit is.