poniedziałek, 3 sierpnia 2009

MD5 mesh loader

Przebrnąłem przez napisanie funkcji ładującej model z pliku md5.

Na początek linki:
1 Eksporter do Blendera i modele
2 Opis formatu
3 Opis jak ładować z tego formatu
4 Temat na Warsztacie

A teraz moje uwagi i wnioski:
1. Dane joint'ów zapisane są względem początku układu, a nie rodzica. Aby wyznaczyć transformację względem rodzica należy skorzystać z tych równań:
p * q = g => q = p^-1 * g
p + v = g => v = g - p
p - parent, czyli dane rodzica
g - global, czyli dane zapisane w pliku
q i v - to kwaternion i wektor
p^-1 to oczywiście inwersja kwaternionu rodzica
2. Kwaterniony są zapisane w formie samych osi, bez w. Ja dowiedziałem się o tym z [3]. Skorzystano tu z faktu, że długość kwaternionu musi być równa 1. 1 = w*w + x*x + y*y + z*z. Chyba łatwo wyznaczyć ile wynosi w. Pamiętać tylko trzeba, że nie należy wyciągać pierwiastka kwadratowego z liczb ujemnych.
3. Pozycje wag są zapisane względem kości i to z uwzględnieniem orientacji. Aby wyznaczyć finalną pozycję, trzeba najpierw obrócić pozycję wagi o orientację kości. Dopiero tak obróconą translację możemy zsumować z pozycją kości. Wzór na rotację [3] punktu o kwaternion: a' = q * a * q^-1. Przy czym a i a' to kwaterniony z częścią rzeczywistą równą pozycji punktu i urojoną 0, trzeba o tym pamiętać.
4. Format nie przechowuje informacji o normalnych. Wyznacza się je oczywiście przy użyciu mnożenia wektorowego (cross product). Trzeba tu jednak wziąć pod uwagę, że indeksy wierzchołków są w CCW. To mnie zaskoczyło, ale tak mi wyszło. Nie wiem jednak czy to przypadkiem nie jest "wina" eksportera.
5. Plik ma 682 linijki. Czyli kupa roboty.

Brak komentarzy: