Autor Wątek: Struktura kości w pliku danych tego modelu 3d  (Przeczytany 1017 razy)

Offline Montjet

  • Użytkownik

# Czerwiec 15, 2015, 13:20:11
Próbuję na nowo zaprojektować strukturę pliku przechowującego dane nt. modelu 3d.
Strasznie gubię się.
Czym różni się macierz transformacji kości od macierzy Offset'owej?
Macierz Offset'owa nie opisuje może właśnie długości kości - pozycja zaczepienia Child'a?
Jak zapisywać dane kości?

%BONES_INFO_CHUNK
%OFFSET_MATRIX
%ID_PARENT
%NUM_CHILDREN
%ID_CHILD[1]
%ID_CHILD[2]
...
%ID_CHILD[NUM_CHILDREN]
%WEIGHTS_CHUNK
%NUM_WEIGHTS
%VERT_ID
%VALUE

Co zmienić/ poprawić/ dodać/ ująć ?
« Ostatnia zmiana: Czerwiec 15, 2015, 14:20:03 wysłana przez Montjet »

Offline Mr. Spam

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

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 15, 2015, 15:31:54
Cytuj
Czym różni się macierz transformacji kości od macierzy Offset'owej?
Macierz kości możesz trzymać jako transformację względem rodzica, albo jako całkowitą transformację względem początku układu współrzędnych modelu. Ta druga to oczywiście iloczyn wszystkich macierzy kości po drodze w hierarchii. W grach spotykałem się już i z jednym i z drugim.

Zalety i wady zależą od tego, jak robisz interpolację pomiędzy klatkami. Jeżeli macierze interpolujesz liniowo, to trzymanie macierzy względem kości rodzica mija się z celem. Klatek w tym wypadku musi być i tak odpowiednio dużo (względem szybkości animacji), bo inaczej przy szybkich ruchach kości będą się skracały (zamiast pójść obrotem po łuku, koniec kości pójdzie po prostej cięciwie), a trzymanie macierzy względem początku układu diametralnie uprości samą zabawę z modelem (nie potrzebujesz żadnej hierarchii by wyświetlić, bo masz gotowe finalne macierze kości).

Jeżeli jednak robisz bardziej zaawansowaną interpolację tych macierzy (np. sześcienną), to już może opłacać się myślę trzymać hierarchię. W tym wypadku jednak skłaniał bym się już ku trzymaniu translacji i kwaternionów zamiast macierzy.

Podsumowując, wszystko zależy od tego ile mocy CPU chcesz zainwestować w wyświetlanie, jaką masz częstotliwość klatek kluczowych i jakiej jakości chcesz animację wyświetlić.

Cytuj
Jak zapisywać dane kości?
Z tego co bym poprawił:
1. Wywalić identyfikatory dzieci - ID_PARENT przekazuje całą informację, a listę dzieci można z tego wygenerować przy ładowaniu, jeśli potrzebujesz.
2. Wagi są bardziej informacją vertexa, niż kości, a przynajmniej tam są bardziej potrzebne.

Punkt 2. znowu bardziej zależy od tego, czy robisz skinning na CPU, czy na GPU. Ja robię na GPU i pakuję całą informację o wagach do 7 bajtów per-vertex. Dla vertexa wybieram 4 kości o największych wagach, normalizuję te wagi (skaluję by suma była 1) i sortuję. 4 bajty idą na numery kości, a pozostałe 3 na wagi względne - waga najważniejszej kości (załóżmy a=w1), potem waga drugiej względem tego co zostało (b=w2/(1-w1)) i waga trzeciej z reszty (c=w3/(1-w1-w2)). Waga czwartej to oczywiście reszta. W Vertex Shaderze na GPU możesz wtedy wczytać dane z dwóch 4-elementowych wektorów typu Unsigned Byte (nienormalizowany na indeksy, normalizowany na wagi) i lerpować. :)

Ale jeżeli nie chcesz ograniczać liczby kości do 4, to i tak sugerował bym przenieść wagi do vertexów (tyle że bez ograniczenia limitu kości).

Offline Kyroaku

  • Użytkownik

# Czerwiec 15, 2015, 20:40:19
Cytuj
Czym różni się macierz transformacji kości od macierzy Offset'owej?
Krzysiek chyba tak się rozpisał, że zapomniał odpowiedzieć na pytanie :)

Sam możesz sobie łatwo odpowiedzieć, próbując zaimplementować animacje szkieletowe bez użycia tej macierzy.

Można powiedzieć, że jest to pozycja i orientacja względem mesh'a. Nazwijmy to pozycją początkową. Do wyliczania macierzy końcowych dla kości, na końcu wszystko przemnaża się przez inverse(offsetMatrix), czyli "cofa" się obiekt o tą pozycję początkową. Dzięki temu przy rotacji kości, wierzchołki obracają się względem początku kości, a nie początku układu współrzędnych.

Cytuj
Macierz Offset'owa nie opisuje może właśnie długości kości - pozycja zaczepienia Child'a?
Nie. Długości kości się nie przechowuje, ponieważ nie jest ona potrzebna do niczego. Kość tak na prawdę nie istnieje. "Szkielet" jest jedynie graficzna reprezentacją zbioru macierzy.
Podejrzewam, że tylko formaty edytorów (np., .max) przechowują długości kości.
« Ostatnia zmiana: Czerwiec 15, 2015, 20:52:14 wysłana przez Kyroaku »