Складні числа мали хитрий спосіб – Гамміль хотів більшого
Помноження 2D точки на e^(iθ) робить її поворот на θ – складні числа дають 2D обертання безкоштовно. Вільям Райан Гамміль витратив більше десятиліть у 1830-х та 1840-х роках, намагаючись знайти тривимірну числову систему, яка б робила те саме для 3D. Прорив, викарбований на Дублінському мосту в 1843 році, полягав у тому, щоб перестати шукати три ім'ягрові одиниці та використовувати замість цього чотири дійсні числа: i² = j² = k² = ijk = −1. Отримані кватерніони ℍ виявилися точно правильної форми для представлення 3D орієнтації – без сингулярностей, плавне інтерполювання та лише чотири цифри для зберігання замість дев'яти записів обертання матриці.
Кватерніон записаний як q = w + xi + yj + zk, або як пара (w, v) де w є скалярною частиною, а v = (x, y, z) є векторною частиною. Множення не комутативне – pq ≠ qp в загальному випадку — що не є недоліком, це відображає фізичний факт, що обертання навколо X потім Y дає інший результат, ніж Y потім X.
Поворот кватерніона: без блокування ося
Щоб повернути вектор v на кут θ навколо одиничного осі n̂, побудуйте кватерніон з половини кута:
q = cos(θ/2) + n̂ · sin(θ/2) // вбудуйте v як чистий кватерніон (0, v), потім загорніть його: v' = q · (0, v) · q⁻¹ // v' також є чистим кватерніоном — його векторна частина є повернутим v. // складання q1 і q2: застосовуйте q2·q1, справа наліво
Половину кута не можна обрати будь-яким чином — вона випливає безпосередньо з алгебри, оскільки загорнення застосовує поворот двічі (з обох боків від v). Це також пояснює тонкість, яку варто знати: кватерніони живуть на сфері S³ у ℝ⁴, яка подвоює групу обертань SO(3) у 3D. Кватерніон q і його негатив −q дають точно однакові повороти, тому повний поворот об’єкта відповідає кватерніону, який проходить лише половину свого великого кола.
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
Гімбал замок: проблема, яку будували кватерніони, щоб уникнути
Ортогональні кути представляють орієнтацію як послідовність трьох послідовних обертань навколо координатних осей — yaw, pitch, roll. Це природно читається для людей, але має структурний недолік: коли серединне обертання досягає ±90°, перша та третя осі вирівнюються одна з одною. Дві з трьох ступенів обертання колапсують в один і цілий напрямок руху стає недоступним без дискримінного стрибка. Це — гірляндковий замок — така сама проблема, що й турбувала команду Apollo guidance computer, і та ж сама проблема, що робить плечовий шар анімеді персонажа раптово перемикатися, коли він проходить через вертикальну площину при анімації.
Вибір будь-якого порядку обертання не усуває гірляндковий замок — він просто переміщує початкову орієнтацію. Кватерніони уникають цієї проблеми, оскільки параметризують SO(3) з плавною, безперешкодною сингулярною чотиривимірною вкладеністю (з урахуванням нешкідливого подвійного покриття q / −q), тому немає орієнтації, при якій сама репрезентація руйнується.
SLERP: інтерполяція вздовж сфери, а не через неї
Наївне змішування двох орієнтацій — лінійна інтерполяція чотирьох чисел q₀ та q₁ — призводить до відхилення результату від одиничної сфери та потребує нормалізації, що дає нерівномірну, "хитку" кутову швидкість. SLERP (сферична лінійна інтерполяція) замість цього йде вздовж дуги великого кола між q₀ та q₁ з постійною кутовою швидкістю:
Ω = arccos(q0 · q1) // половинка кута між двома обертаннями slerp(q0, q1, t) = sin((1−t)Ω)/sin(Ω) · q0 + sin(tΩ)/sin(Ω) · q1 // якщо Ω ≈ 0, використовуйте NLERP замість цього, щоб уникнути ділення на ~0: nlerp(q0, q1, t) = normalise((1−t)·q0 + t·q1) SLERP робить панорамування камери, злиття анімації персонажів та маневри орієнтації косліта чистими, а не ривкими. Оскільки для цього потрібно зробити кілька тригонометричних обчислень за кадр, двигуни повертаються до дешевших NLERP, коли два напрямки вже близькі один до одного, де візуальна різниця незначна.
Ω = 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)
Как симуляция здесь их сравнивает
Симуляция на этом сайте приводит два каркасных куба от одних и тех же ползунков yaw/pitch/roll — один накапливает вращение как углы Эйлера, а другой преобразует каждый шаг в кватернион и применяет формулу "сэндвич". Потяните ползунок pitch к 90° и куб Эйлера заметно заклинивает: yaw и roll начинают вращать его вокруг одной и той же оси. Куб кватернионов плавно отслеживает ту же ориентацию без каких-либо особых случаев. Переключение SLERP показывает тот же контраст для интерполяции между двумя произвольными ориентациями, а не ползунки, удерживаемые постоянными значениями.
Frequently asked questions
Чому не можна просто фіксувати еulerівські кути замість використання кватерніонів?
Гімбал-запинок – це не помилка конкретної реалізації, а структурна властивість представлення 3D орієнтації як послідовних обертань вздовж трьох осей: коли серединне обертання досягає 90 градусів, дві з трьох осей обертання стають паралельними, і втрачається ступінь свободи. Будь-який вибір порядку обертання не усуває сингулярність, він лише переміщує її в іншу орієнтацію. Кватерніони повністю уникають цього, оскільки вони параметризують обертання чотирма числами на сфері, без випадків вирівнювання осей, які могли б спровокувати сингулярність.
Чому кватерніони використовують половину кута повороту, θ/2, замість θ?
Обертання застосовується як продукт «бутерброд»: q·v·q⁻¹, і кожен множення на q вносить поворот на θ/2 у підлеглій алгебрі, тому два множення комбінуються в повний поворот на θ. Це також пояснює подвійне покриття: q та −q обидва генерують цей продукт «бутерброд» для одного й того ж повороту, тому повний 360° оберт фізичного об'єкта відповідає лише 180° подорожі кватерніона по сфері.
Коли використовувати SLERP замість простого усереднення двох кватерніонів?
Наївне лінійне змішування двох одиничних кватерніонів відхиляється від одиничної сфери і потребує ренормляції, що призводить до нерівномірної швидкості кута – інтерпольоване обертання сповільнюється поблизу кінцевих точок і прискорюється посередині. SLERP рухається вздовж великої дуги між двома орієнтаціями з постійною кутовою швидкістю, що необхідно для плавних панорамний переглядів та змішування анімації. Для дуже малих кутів між кватерніонами нормалізоване лінійне змішування (NLERP) є дешевшим і візуально невідрізним замісником.
Спробуйте наживо
Усе, що вище, працює прямо у вашому браузері — відкрийте the simulation і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.
▶ Відкрити симуляцію the simulation