Obecnie tworzę animację szkieletusystem dla mojego obecnego projektu. Myślę, że rozumiem, jak to działa po wielu lekturach, ale patrząc na źródło różnych projektów, zastanawiałem się jednak, dlaczego wartości skali, obrotu i translacji każdej kości są przechowywane osobno. Można przechowywać wszystkie z nich w ramach jednej matrycy, prawda? Czy nie byłoby to bardziej wydajne, czy też potrzebujesz więcej matematyki, aby uzyskać oddzielne wartości, które sprawiają, że jest ona mniej wydajna?
Również podczas gdy jestem w tym, wydaje się, że są 2typowe sposoby przechowywania wartości, którymi są macierze, lub za pomocą wektorów i kwaternionów. Ta ostatnia jest używana częściej, aby uniknąć blokady kardana. Jednak mój projekt ma tylko 2 stopnie swobody. Jaki byłby najbardziej efektywny sposób przechowywania moich wartości?
Odpowiedzi:
1 dla odpowiedzi № 1Nie, matryca nie byłaby bardziej wydajna, ponieważ musiałbyś użyć matrycy 4x4, czyli 16 zmiennych, głównie ze względu na sposób, w jaki rotacja + translacja są przechowywane w macierzy.
Jeśli przechowujesz wartości w formie SRT, otrzymujesz 9 paczek, ponieważ komponent w czwartym miejscu obrotu może zostać ponownie obliczony z pozostałych podczas ładowania.
Co więcej, wiele silników gier nie obsługuje niejednolitego skalowania, więc możesz zmniejszyć do 1 jednostki pływającej i uzyskać 8 jednostek pływających na kości!
I to przed kompresją: skoro wiesz, że kości nie przesuwają się o pewien punkt (są obwiedni), to nie ma sensu przypisywanie precyzji do tych zakresów, których nigdy nie osiągniesz, więc możesz zakodować te spływy, by powiedzieć 16-bitowe, więc kończy się 4 pływakami na kości.
Teraz, aby być uczciwym, nigdy nie zaimplementowałem tej ostatniej części z kompresją, wydawało mi się to trochę ekstremalne i nie miałem czasu.
Ale przejście z 64 bajtów na kości do 32 bajtów na kość to 50% oszczędności!