Интегрируйте угловую скорость как вращение кватерниона

Некоторое время я (несколько слепо) использовал кватернионы для вращения в симуляции твердого тела в физике, но недавно начал путаться в том, как обычно определяются вращения кватернионов и как я это делаю (на основе книги Physics для разработчиков игр).

В книге у вас есть угловая скорость angVel и шаг по времени dt, а также начальная ориентация.

Это делается следующим образом

ориентация + = 0,5 * ориентация * угол * dt

где умножение кватерниона на вектор выполняется сначала путем преобразования вектора xyz в кватернион xyz, 0

Это работает, но во всех остальных случаях вместо этого используется кватернион, который определяет интегрированный по времени angVel по dt, а затем умножает его на ориентацию. По сути, он преобразует angVel * dt в поворот (что имеет смысл), который затем применяется к исходной ориентации посредством умножения, как показано здесь с улучшенным синтаксисом вектор-угловой-скорости-3-к-единице-кватернион-ориентация

Мой вопрос в том, что 0,5 * кватернион * вектор * скаляр концептуально есть в приведенном выше и что такое добавление этого результирующего кватерниона к моей ориентации, учитывая, что вы обычно умножаете, а не складываете, вращать.


person JoeTaicoon    schedule 24.10.2017    source источник
comment
Проверьте этот ответ stackoverflow.com/questions/24197182/   -  person minorlogic    schedule 24.10.2017
comment
Спасибо, что, кажется, ответ на него, да. Оказалось, что версия, которую я только что использовал из коробки, на самом деле была приблизительной. Я прекрасно понимал, что в нем нет греха и косяка, поэтому он действительно казался быстрее. Спасибо, что указали мне в этом направлении. Проголосует за ваш предыдущий ответ :-)   -  person JoeTaicoon    schedule 24.10.2017
comment
Если подумать, возможно, нет. Вы объясняете происхождение кватерниона дельта-поворота, но в моем примере он добавлен к оригиналу, а вы бы умножили свой на оригинал, верно?   -  person JoeTaicoon    schedule 24.10.2017
comment
Вы можете попробовать расширить умножение кватернионов с дельта-вращением, чтобы получить форму с добавлением.   -  person minorlogic    schedule 25.10.2017


Ответы (2)


Чтобы закрыть это как следует, я расширю комментарий minorlogic здесь.

Производная по времени кватерниона q вращения из-за угловой скорости v задается как

dq/dt = 0.5*q*v

Здесь v - определяющая угловая скорость в форме, где направление вектора определяет ось вращения, а величина определяет скорость вращения. v далее дано в "локальном пространстве". Если бы v находился в «мировом пространстве», порядок умножения q и v был бы обратным.

Тогда выражение вопросов

orientation += 0.5*orientation*angVel * dt

оказывается просто обычным интегрированием первого порядка по времени с использованием этой производной по времени. Однако он не очень точен и требует постоянной перенормировки кватерниона ориентации, но он простой и быстрый и не использует ни sin, ни cos, как преобразования углов оси.

Проблема точности и требования к нормализации можно объяснить, рассматривая единичные кватернионы, которыми должно быть собственное вращение, как точки, лежащие на 4-мерной сфере, а производную - как векторы, перпендикулярные этой поверхности сферы. Очевидно, что если вы просто добавите такой вектор к такой точке на поверхности, вы получите новую точку, которая больше не на поверхности, а немного выше. Насколько мало зависит от величины этого вектора и временного шага, который вы умножаете на свой производный вектор. Затем требуется нормализация, чтобы вернуть его на поверхность.

Чтобы прямо ответить на вопрос. Мультипликативный метод используется, когда у вас есть ориентация и известный кватернион вращения, на который нужно повернуть, в то время как аддитивный метод пытается достичь той же цели путем интегрирования производной первого порядка.

person JoeTaicoon    schedule 25.10.2017

См. этот ответ - предоставленный вами код представляет собой расширение серии Тейлора 1-го порядка возведения в степень кватерниона, которое используется для интеграции угловая скорость на дискретном интервале времени dt. Вы можете использовать другой пример кода в этом посте (первый пример кода), если вам нужен более точный способ преобразования угловых скоростей во вращение, используя фактическое возведение в степень кватерниона, а не приближение ряда Тейлора.

См. этот вывод, если вас интересует математика.

person Luke Hutchison    schedule 01.11.2019