Кватерніони та обертання навколо світової осі


11

Відмова: Я професійний програміст ігор і користуюся кватерніонами більшість днів, але вони мені близькі до чорної магії. Я відносно вдома з математикою, але уявні числа завжди мене бентежили. Я схильний вважати квати як корисними і не раз перетворюю на множення. Я намагаюся міркувати про них так, як би я матрицями з обмеженим успіхом.

У всякому разі….

Що мене бентежить, це наступне. Коли я хочу обертати об'єкт навколо його локальної осі, я помножую його обертання на кватерніон, який представляє обертання, яке я хочу застосувати. Тому це обертання в локальному просторі.

Тепер, якщо я хочу обертати його навколо осі у світовому просторі, моїм міркуванням було б: сприйміть обертання у світовому просторі як кватерніон. Помножте обертання обертання мого об'єкта на цей кватерніон. Це призведе до моєї світової ротації в місцевому просторі. Помножте обертання на цей новий кватерніон. тобто: newRot = oldRot * (зворотний oldRot * worldRot)

Однак мені потрібно зробити newRot = oldRot * (зворотний oldRot * worldRot) * oldRot.

Чому мені після множення на зворотний кват все ще потрібно помножити власний кват перед його застосуванням? Я знаю, що повинна бути ідеальна поважна причина, але я не можу пояснити свій вихід із цього, і це мене засмучує, як чорт. Я спробував різні файли та багато чого іншого, але більшість заглиблюється в математику, роблячи це менш зрозумілим для мене.

Хто-небудь може мені це пояснити, як мені 5 років?


Хіба це не так, як матричні переклади та обертання (тобто вам потрібно перемістити об’єкт до центру, повернути, а потім перемістити назад, коли ви хочете обертати предмет навколо себе: Minv_transl * Mrot * Mtransl)
Valmond

I try to reason about them like I would with matrices- значить, ви на правильному шляху. Якщо ви зрозуміли, як обертатися навколо осей об'єкта та осей світу за допомогою матриць, ви можете зробити те ж саме, використовуючи кватерніони. Порядок множення однаковий для обох, матриць та кватерніонів.
Майк Семдер

Відповіді:


11

Кватерніони асоціативні:

Ви згадуєте, що ваше рішення:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

що те саме, що:

newRot = oldRot * inverse oldRot * worldRot * oldRot

що те саме, що:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

що насправді повертає вас до того, що відбувається насправді:

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

Порядок подання заявки змінюється, тобто все. Повертаючись до матриць, коли ви застосовуєте матрицю об'єкта до матриці перетворення та зберігаєте її як нову матрицю об'єкта, це ваше місцеве просторове перетворення. Якщо ви застосуєте матрицю перетворення до матриці об'єктів і збережіть це, це ви всесвітнє перетворення. Це все про порядок подачі заявки та нічого більше.


1
+1 для першої частини, друга частина трохи вводить в оману. Якщо ви використовуєте лише "гниття" в останньому зразку коду, а не "localRot" і "worldRot", приклад стає зрозумілішим. Інакше це означає, що самі гнилі так чи інакше відрізняються . Але різниця полягає лише в порядку множення, як ви показали, а не в різних кватерніонах ("localRot" і "worldRot"). 'localTransformed' та 'worldTransformed' було б краще: 'rotatedAroundLocalAxis' та 'rotatedAroundWorldAxis'. Це саме пояснило б рівняння та зробило останній абзац застарілим, що має деякі недоліки.
Майк Семдер

Недоліки в останньому абзаці: відмінність між матрицею та перетворенням (обидва тут однакові та взаємозамінні, тому краще використовувати просто матрицю для запобігання плутанини) та терміни "перетворення місцевого простору" та "трансформація світу": було б більше Правильно сказати, перше рівняння дає вам "матрицю локального до світу" після обертання навколо локальної осі об'єкта, друге дає вам "матрицю" місцевий світ "після обертання навколо осі світу. В обох випадках ви отримуєте просто "матрицю локального світу". Однак у першій частині все одно є мій +1 для аналізу.
Майк Семдер

+1 @Maik, можливо, ви могли б написати окрему відповідь, щоб зробити байдужіше між обертаннями та питанням порядку множення ще зрозумілішим? Дякуємо за коментар у будь-якому випадку!
Макс Доме

Ах, тепер це має сенс. Я не знав (о, це було б у FAQ), що множення кватерніона було асоціативним, тому дійсно обертання і зворотне скасування в будь-який інший момент, даючи мені зрозуміти, що мені потрібно, один має локальне обертання праворуч, а інше - зліва, які в основному кажуть "застосувати обертання в батьківському просторі" або "застосувати обертання в локальному просторі" .... не відрізняється від матриць. Досить елементарно, як тільки ви це побачите! Дякую!
Кай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.