Strona głównaArtykułyObrot 3D

Obrot kwaternionowy: czemu cztery liczby zastępują trzy kąty

Algebra Hamiltona ℝ⁴, formula sandwich obrotu wektora, powodów, dla których kąty Eulera stają się nieefektywne w punkcie zamka gimbalu, oraz SLERP — liniowa interpolacja między dwoma orientacjami.

mysimulator teamZaktualizowano — czerwiec 2026≈ 12 min czytania▶ Otwórz symulację

Kompleksowe liczby miały tajemnicę — Hamilton chciał coś większego

Mnożenie punktu 2D przez e^(iθ) obraca go o θ — liczby zespolone oferują obrót w 2D jako domyślną funkcję. William Rowan Hamilton poświęcił ponad dziesięć lat lat 1830-40, próbując znaleźć system liczb trójwymiarowy, który robiłby to samo dla 3D. Odkrycie zrobione w 1843 roku na mostku w Dublinie polegało na przestaniu szukać trzech jednostek urojonych i używania zamiast nich czterech liczb rzeczywistych: i² = j² = k² = ijk = −1. Wynikające kwaterniony ℍ okazały się dokładnie takie, jak potrzebne do reprezentacji orientacji w 3D — bez singularności, płynna interpolacja i tylko cztery liczby do przechowywania zamiast dziewięciu wpisów macierzy obrotu.

Kwaternion jest zapisywany jako q = w + xi + yj + zk, lub jako para (w, v), gdzie w to część skalarna, a v = (x, y, z) to część wektorowa. Mnożenie nie jest komutatywne — pq ≠ qp w ogólności — co nie jest blemem, ponieważ odbiega od fizycznego faktu, że obrót wokół osi X a nastepnie Y daje inny wynik niż obrót wokół Y a nastepnie X.

demo na żywo · powiązana symulacja● LIVE

Obrot sandwich

Aby obrócić wektor v o kąt θ wokół jednostkowego osi n̂, stwórz z polowy kąta jednostkowy kwaternion:

q = cos(θ/2) + n̂ · sin(θ/2) // wsparz v jako pusty kwaternion (0, v), a następnie sandwichuj go: v' = q · (0, v) · q⁻¹ // v' jest również pustym kwaternionem — jego część wektorowa to obrócony v. // składanie q1 potem q2: zastosuj q2·q1, od prawej do lewej Polowy kąt nie jest konwencją losową — wynika bezpośrednio z algebry, ponieważ sandwich wykonuje obrot dwukrotnie (z jednej strony wektora na drugą). To wyjaśnia zagadnienie warto znać: jednostkowe kwaterniony żyją na sferze 3-wymiarowej S³ w ℝ⁴, która podwójnie pokrywa grupę obrótów 3D SO(3). Kwaternion q i jego odwrotność −q powodują dokładnie taki sam obrot, więc pełny obrót o 360° odpowiada tracieniu kwaterniona tylko połowy swojej wielkiej okręgowej ścieżki.

q = cos(θ/2) + n̂ · sin(θ/2)

// embed v as a pure quaternion (0, v), then sandwich it:
v' = q · (0, v) · q⁻¹

// v' is also a pure quaternion — its vector part is the rotated v.
// composing q1 then q2: apply q2·q1, right to left

Zakłócenie gimbalowe: problem, który kwaterniony były zaprojektowane do uniknięcia

Kąty Eulera reprezentują orientację jako trzy kolejne obroty wokół osi współrzędnych — yaw (obrot wokół osi Y), pitch (obrot wokół osi X) i roll (obrot wokół osi Z). Odczytanie tego jest naturalne dla ludzi, ale ma strukturalny problem: kiedy drugi obert osiąga ±90°, pierwsza i trzecia osa zaczynają się ustawiać na siebie. Dwa z trzech stopni swobodnych obrotu redukują się do jednego, a cała kierunek ruchu staje się niedostępny bez nieciągłościowego skoku. To jest zakłócenie gimbalowe — ten sam problem, który słynnie martwił zaawansowane systemy orientacji Apollo, i ten sam problem, który sprawia, że stopa postaci animowanej nagle obraca się gwałtownie po przekroczeniu pola.

Brak kolejności obrotu, któryby usunął zakłócenie gimbalowe — tylko przeniósłby go do innej orientacji. Kwaterniony unikają tego problemu, ponieważ parametryzują SO(3) w spójnym, bez singularności czterodimensionalnym wprowadzeniu (modulo niewyrażonego pokrycia q / −q), więc nie ma orientacji, w której reprezentacja sama by się rozpadła.

SLERP: interpolowanie po kuli, nie przez nią

Wygładzanie dwóch orientacji na podstawie — liniowego interpolowania czterech liczb z q₀ i q₁ — przesuwa wynik poza kulę jednostkową i wymaga normalizacji, co powoduje nieuniformne, „drgające” prędkość kątowa. SLERP (spherical linear interpolation) zamiast tego porusza się po łuku wielkiego krzywej między q₀ a q₁ przy stałej prędkości kątowej:

Ω = arccos(q0 · q1) // połowa kąta między dwiema rotacjami slerp(q0, q1, t) = sin((1−t)Ω)/sin(Ω) · q0 + sin(tΩ)/sin(Ω) · q1 // jeśli Ω ≈ 0, użyj NLERP zamiast tego, aby uniknąć dzielenia przez ~0: nlerp(q0, q1, t) = normalise((1−t)·q0 + t·q1) SLERP jest to co sprawia, że obrot kamery, animacje postaci i manewry orientacji statków kosmicznych wyglądają płynnie zamiast ruchomo. Ponieważ kosztuje to kilka wywołań funkcji trygonometrycznej na ramkę, silniki wracają do tańszej NLERP, gdy dwie orientacje są już blisko siebie, gdzie różnice wizualne są niewyraźne.

Ω = arccos(q0 · q1)                 // half the angle between the two rotations
slerp(q0, q1, t) = sin((1−t)Ω)/sin(Ω) · q0 + sin(tΩ)/sin(Ω) · q1

// if Ω ≈ 0, use NLERP instead to avoid a division by ~0:
nlerp(q0, q1, t) = normalise((1−t)·q0 + t·q1)

Jak symulacja porównuje je tutaj

Symulacja na tej stronie steruje dwiema szkieletowymi sześcianami za pomocą tych samych przycisków do ustawień skrętu/pochylenia/obrotu — jeden akumuluje rotację jako kąty Eulera, drugi konwertuje każdy krok na kwaternion i zastosowuje formułę sandwich. Przeciągnij przycisk poziomego skrętu w kierunku 90° i sześcian o kątach Eulera widocznie zaczyna się blokować: ustawienia skrętu i obrotu zaczynają go obracać wokół tej samej osi. Sześcian oparty na kwaternionach kontynuuje monitorowanie płynnie w tej samej orientacji bez żadnego specjalnego przypadku. Przełączanie SLERP pokazuje to samo kontrasty dla interpolacji między dwoma dowolnymi orientacjami, zamiast przycisków utrzymywanych przy stałych wartościach.

Często zadawane pytania

Dlaczego nie można tylko naprawić kątów Eulera zamiast przejść do kwaternionów?

Gimbal lock to nie błąd w konkretnym wykonaniu, a strukturalna właściwość reprezentowania orientacji 3D jako trzy kolejne rotacje osi: kiedy druga rotacja osiąga 90 stopni, dwie z trzech osi rotacyjnych stają się równoległe i utracony jest stopień swobody. Brak wyboru porządku rotacji usuwa singularity tylko przesuwa je do innej orientacji. Kwaterniony unikają tego całkowicie, ponieważ parametryzują rotacje czterema liczbami na sferze, bez przypadku aligmentu osi do wyzwolenia.

Dlaczego kwaterniony używają połowy kąta θ/2 zamiast θ?

Rotacja jest stosowana jako produkt sandwich q·v·q⁻¹, a każda mnożenie przez q dodaje rotację o θ/2 w podstawowej algebrze, więc dwie mnożenia łączą się do pełnej rotacji o θ. To wyjaśnia również dwukrotne pokrycie: q i −q obydwa powodują ten sam produkt sandwich dla tej samej rotacji, dlatego pełny obrót fizycznego przedmiotu odpowiada tylko 180° przebiegu kwaterniona wokół jego sfery.

Kiedy powinienem używać SLERP zamiast prostego średniego dwóch kwaternionów?

Prosta liniowa interpolacja dwóch jednostkowych kwaternionów odchyla się od sfery jednostkowej i musi być normalizowana, co powoduje nierównomierną prędkość kątową — interpolowana rotacja wolniej się porusza blisko końców i szybciej w środku. SLERP porusza się po wielkiej okręgu między dwoma orientacjami z stałym prędkością kątową, co jest potrzebne dla płynnych obrót kamery i interpolacji animacji. Dla bardzo małych kątów między kwaternionami, normalizowana liniowa interpolacja (NLERP) jest tańsza i nieodróżnialna wizualnie zastępcą.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Quaternion Rotation i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację Quaternion Rotation

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)