2009-11-06 13 views
6

Czworonoce są dobre do interpolacji między nimi. jak na razie dobrze.Czy mogę interpolować rotację z dwóch kwaternionów utworzonych z Yaw/Pitch/roll?

Jeśli mam grę sieciową, czy wystarczy przenieść rotację jako wektor3f, czy też powinienem użyć kwaternionu? Aby gra była płynniejsza, może zajść potrzeba interpolacji między ostatnio wysłanym rotacją a bieżącym.

Ale czy mogę interpolować rotacje między dwoma kwaternionami, które zostały utworzone z Yaw/Pitch/Roll?

Quaternion a = Quaternion.FromYawPitchRoll(x1,y1,z1); 

Quaternion b = Quaternion.FromYawPitchRoll(x2,y2,z2); 

a.Interpolate(b, value); // will this work correctly? 

Odpowiedz

6

Tak, można. Problem z kątami Eulera to blokowanie kardana, że ​​niektóre orientacje jony kończą się jednym mniejszym stopniem swobody. Kiedy konwertujesz z kątów Eulera na kwaternion, problem ten zostaje rozwiązany. Możesz przekonwertować prawie dowolną reprezentację osi 3D na kwaternioną formę iz powrotem, bez utraty informacji. Matryce muszą być izotropowe (bez skali lub ścinania), a wektory muszą mieć długość jednostkową.

Interpolacja liniowa między kwaternionami nazywa się slerp. Interpolacja kwadratowa między kwaternionami nazywa się skład. Ponieważ kwaterunki są po prostu liczbami zespolonymi z trzema częściami urojonymi, te same równania, które działają na liczbach rzeczywistych i wektorach, odnoszą się do kwaternionów. Pamiętaj tylko, aby używać właściwych reguł podczas mnożenia, dodawania, logowania i potęgowania. Można sobie wyobrazić, że części wyobrażeniowe i, j i k razem tworzą wektor osi, podczas gdy częścią rzeczywistą jest skala.

+0

Powinieneś wspomnieć (jak to zrobił), że zwykły "lerp" w wielu wypadkach działa dobrze dla kwaternionów. –

+0

Czytałem, że obroty Eulera nie są jednoznaczne, więc nie można ich interpolować. Przekształcenie ich w kwaternionie naprawdę czyni je jednoznacznymi, co wydaje mi się trochę nielogiczne. – codymanix

+0

@codymanix: Być może, ale tak jest. Nie można też _używać kątów bezpośrednio.Ponieważ kwaterunki mają dodatkowy stopień swobody, unikają całego problemu z blokadą kardana, bez względu na to, co poprzednio reprezentowało, lub na co się później przekształca. Kąty Eulera -> kwaternion -> matryca jest całkowicie koszerna. –

5

Można interpolować między kwaternionami. Kiedyś napisałem generator animacji klatek kluczowych oparty na kwaternionach, który wygenerował ramki dla systemów renderowania z kilku określonych punktów. Nie mogę udostępnić kodu, ponieważ jest on sklasyfikowany :-(

W sprawie SIGGRAPH w latach 80. pojawił się artykuł na ten temat. Główną zaletą kwaternionów jest to, że nie ma osobliwości takiej, jak w przypadku kątów Eulera. .

Ach, tu jest odniesienie:

Shoemaker, Ken „Animowanie Obrót z krzywymi quaternion” SIGGRAPH '85, San Francisco, lip 22-26, 1985, tom 19, nr 3, 1985.. ACM 0-89791-166-0/85/007/0245, str. 245-254.

+0

Czwartorzędności nie cierpią z powodu blokady Gimbal, ale mają niejasności. [1, i, j, k] i [-1, i, j, k] reprezentują tę samą orientację. Uważam za dziwne, że -1 oznacza 360 stopni rotacji w złożonej płaszczyźnie, zamiast zwykłej 180, jak w przypadku wektorów :-) –

+2

To nie jest dość niejednoznaczne, gdy używane są jako klatki kluczowe. (1,0,0,0) -> (0,0,0,0) -> (1,0,0,0) reprezentuje kolejny ruch (1,0,0,0) -> (0,0) , 0,0) -> (- 1,0,0,0), chociaż pozycja początkowa i końcowa, a nawet położenie pośrednie są takie same. – WorldSEnder

4

Tak i nie. Oto dobra dyskusja: http://number-none.com/product/Understanding%20Slerp,%20Then%20Not%20Using%20It/

Pamiętaj, że nie ma znaczenia, w jaki sposób uzyskałeś kwaterunki, obowiązują te same zasady.

Edytuj: Użyłem kodu źródłowego przedstawionego w artykule na temat wielu projektów i mogę za nie ręczyć.

+0

Nie tyle dyskusja, co osoba, która najwyraźniej zdecydowała ;-) Jeśli używasz kwaternionów do interpolacji, to musisz się pogodzić z pewnymi dziwacznymi właściwościami. Myślę, że możemy dać autorowi pytania korzyść z wątpliwości; że to przemyślał. Jednak dobry odczyt. –

+0

"Dyskusja" to grzeczne słowo "rant" :-) – Justicle

+0

Tak, po prostu grzecznie wyrywam ci jaja ;-) Weekend nareszcie! –