Kiedy czwartorzędy powinny być używane do reprezentowania obrotu i skalowania w 3D?

13

Czwartorzędy (czterowymiarowe rozszerzenie liczb zespolonych) można wykorzystać do przedstawienia obrotu i skalowania wektora 3D, a zastosowanie czwartorzędu na wektorze 3D wymaga dwóch multiplikacji czwartorzędowych, a zatem wymaga mniejszej liczby operacji niż pomnożenie przez odpowiednią macierz transformacji. Jednak często stosowane są macierze transformacji liniowej i afinicznej, szczególnie w kodzie shadera.

Kiedy jest właściwe i preferowane (ze względu na prędkość, stabilność itp.) Użycie ćwiartki do reprezentowania skalowania i obrotu w trzech wymiarach zamiast odpowiedniej macierzy transformacji?

es1024
źródło

Odpowiedzi:

8

Chcę zacząć od nieporozumień:

Nowoczesne procesory graficzne (NVIDIA od dłuższego czasu i AMD od Wysp Południowych) nie wspierają znacząco operacji wektorowych / macierzowych natywnie w sprzęcie. Są to architektury wektorowe w innym kierunku: każdy element wektora (x, y, z) ma zazwyczaj wartość 32 lub 64, zawierającą wartości dla każdego elementu na linii. Tak więc iloczyn 3D nie jest zwykle instrukcją, jest pomnożeniem i dwoma pomnożeniami.

Ponadto zliczanie prymitywnych operacji, takich jak wielokrotne dodawanie, transformacja wektora przez czwartorzęd jest droższa niż transformacja wektora za pomocą macierzy. Przekształcanie wektora za pomocą macierzy 3x3 to 3-krotność i 6-krotność dodawania, a przekształcanie wektora przez ćwiartkę to dwa mnożniki czwartorzędowe, z których każdy składa się z 4 mnożeń i 12 mnożeń. (Możesz być mniej naiwny niż ten - tutaj jest szybszy zapis - ale wciąż nie jest tak tani jak pomnożenie wektora przez macierz).

Jednak wydajność nie zawsze jest określana po prostu przez zliczenie liczby operacji ALU, które wykonuje. Czwartorzędy wymagają mniej miejsca niż odpowiednik macierzy (zakładając, że wykonujesz tylko obrót / skalowanie), a to oznacza mniej miejsca na dysku i mniejszy ruch pamięci. Jest to często ważne w animacji (co dogodnie jest często również tam, gdzie pojawiają się ładne właściwości interpolacji czwartorzędów).

Inne niż to:

  • Macierze zajmują więcej miejsca, ponieważ obsługują więcej operacji. Macierz 3x3 może zawierać nierównomierną skalę, pochylenie, odbicie i rzut ortogonalny.
  • Macierze można naturalnie traktować jako wektory podstawowe i łatwo konstruować je z tych wektorów.
  • Mnożenie jednej ćwiartki przez drugą (tworzenie dwóch rotacji) to mniej operacji niż mnożenie jednej macierzy przez drugą.
John Calsbeek
źródło
Zabawne, a na DP3instrukcji Intel Haswell GPU instrukcja ARBfp wydaje się zaimplementowana jako 3 zwielokrotnienia i 2 dodatki, patrz INTEL_DEBUG=fsdane wyjściowe sterownika Intel Linux: paste.ubuntu.com/23150494 . Nie jestem pewien, czy to po prostu słaby sterownik, czy HW naprawdę nie ma specjalnych instrukcji dla wielu wektorów.
Ruslan
@ Ruslan Bardzo prawdopodobne, że sprzęt po prostu nie ma specjalnych instrukcji dla wielu wektorów. Dokładniej jednak tak , ale są one wektoryzowane na całej szerokości SIMD architektury (ścieżki), a nie wektoryzowane w wymiarze vec3 / vec4.
John Calsbeek,
4

(Wiele informacji tutaj bezwstydnie pożyczyłem od odpowiedzi joojai i maniaka grzechotki, z kilkoma własnymi notatkami.)

Zalety matrycy

  • Nierównomierne skalowanie i obrót, pochylanie, rzutowanie
  • Tłumaczenie (chyba że używasz podwójnych czwartorzędów)
  • Natywna obsługa sprzętu
  • Czwartorzędy często wymagają budowy funkcji transcendentalnych
  • Łatwiejszy do zrozumienia

Zalety czwartorzędu

  • Przekształcanie wektora wymaga mniejszej liczby operacji (lub nie - patrz odpowiedź Johna)
  • Przekształcenie przez inny quat wymaga o wiele mniej operacji
  • Czwarty zajmują 4 zmiennoprzecinkowe, (8, jeśli jest podwójna), ale Matryce zajmują od 9 do 16 zmiennoprzecinkowych

Jeśli wiesz, że będziesz robił tylko jednolite transformacje sztywnego ciała, para wektor / quat jest zwykle solidną wygraną na macierzy 3x4 pod względem miejsca do przechowywania (wektor / quat: 7 lub 8 liczb zmiennoprzecinkowych w porównaniu do liczb zmiennoprzecinkowych mat3x4: 12) i szybkość przetwarzania. Jeśli Quaternions nadal są dla ciebie mistycznym voodoo, wypróbuj na nich tę serię internetową .

Jorge Rodriguez
źródło
3

Macierze oferują więcej możliwych transformacji niż ćwiartki, możliwe jest pochylenie, odbicie lustrzane i nierównomierne skalowanie matrycy. Nic nie wskazuje na to, że nie można zmusić silnika do wykonywania tylko transformacji na podstawie czwartorzędu, jeśli nie są potrzebne dodatkowe funkcje transformacji.

Macierze są bardzo wygodne, gdy trzeba budować przestrzenie, w których znamy wektory podstawowe. Na przykład podczas projekcji na ortografię. Łatwe jest także przekształcanie perspektywy w przestrzeni macierzy. Matryce są lepsze, jeśli chodzi o wyświetlanie rzeczy.

W pewien sposób zwykle stosuje się macierze, ponieważ reprezentują one najczęstsze nazwy i nie są zbyt skomplikowane, aby je opanować i zrozumieć. Korzyści ze standaryzacji znacznie przewyższają korzyści wynikające z niestandardowego przepływu pracy. Dobrze wiadomo, jak wykonywać operacje na macierzach. Podczas gdy quaty nie są czymś najbardziej natychmiastowym wprowadzanym w uni. Zapytaj tylko, ilu umie umieć odwrócić kwaternion, podczas gdy nie znajdziesz wielu studentów wyższych uczelni, którzy nie wiedzą, jak odwrócić macierz.

Pamiętaj, że karty graficzne mają również dedykowane potoki do operacji matrycowych.

joojaa
źródło
Właściwie o tym myślałem. Zastanawiałem się również nad pytaniem, jakie inne metody modelowania potoków mogą być użyte w hierarchiach macierzy i quatów.
joojaa,
3

Czwórnik może reprezentować tylko jednolite skalowanie i obrót, więc jeśli potrzebujesz czegoś innego, musisz dodać coś, co to reprezentuje.

Tłumaczenie można wykonać za pomocą jednego dodatkowego vec3 (lub przy użyciu podwójnych czwartorzędów ). Jednak nierównomierne skalowanie i sheering jest lepiej reprezentowane przez mat4. Transformacje rzutowania (zasadniczo nierównomierne skalowanie i zamiana z i w) nie mogą być reprezentowane przez ćwiartkę.

Czwartorzędy mają dużą przewagę podczas interpolacji. Slerp najłatwiej jest obliczyć za pomocą czwartorzędów.

Zastosowanie czwartorzędu (lub podwójnego czwartorzędu) nie jest wbudowane w procesor graficzny, więc trzeba je zaimplementować za pomocą operacji wektorowych. Większość bibliotek czwartorzędowych zakłada, że ​​nie będziesz używać czwartorzędu do reprezentowania skali, więc na to należy zwrócić uwagę.

maniak zapadkowy
źródło