Правильная нормализация двойственного кватерниона

У меня проблемы с двойными кватернионами, и я думаю, это потому, что они не нормализованы должным образом. A, B и A' - двойственные кватернионы, где последний сопряжен. При этом: Q = A * B * A 'теоретически я всегда должен получать Q = B, если A и B правильно нормализованы. Но в некоторых случаях я этого не делаю, и это полностью портит всю мою скелетную иерархию.

На многих страницах показано, что норма двойственного кватерниона равна ||Q|| = sqrt(QQ'), но это означает извлечение квадратного корня из двойственного числа, а я понятия не имею, как это сделать. Так что прямо сейчас я просто делю все это на длину реальной части.

Я искал несколько дней, но мне еще предстоит найти хороший пример кода, как использовать двойные кватернионы. Я чувствую, что знаю теорию довольно хорошо, но я все еще не могу заставить ее работать.


person Sindre    schedule 19.04.2014    source источник


Ответы (3)


Не слишком сложно. Для компьютерной графики интерес представляют только единичные двойственные кватернионы, т.е. ||Q|| = 1. Это приводит к:

QQ' = (R, D)(R*, D*) = (RR*, RD* + DR*) = (1, 0)

Q = двойной кватернион. R = действительная часть, D = двойная часть. Видите ли, для единичных двойственных кватернионов двойственная часть исчезает. Вам нужно только рассчитать величину для действительной части. Таким образом, задача сводится к вычислению величины простого кватерниона. И это вычисляется аналогично тому, как это делается для комплексных чисел:

||R|| = sqrt(r1^2+r2^2+r3^2+r4^2)

(r1 - r4 — компоненты четырехмерного вектора R)

Теперь просто разделите R/||R|| и Д/||Р|| и у вас есть свой нормализованный Q.

person Greenflow    schedule 24.07.2014

Из исходного кода глм:

template <typename T, precision P>
GLM_FUNC_QUALIFIER tdualquat<T, P> normalize(tdualquat<T, P> const & q)
{
    return q / length(q.real);
}

Я проверил реализацию operator/. Он просто делит оба кватерниона с плавающей запятой.

person Joonazan    schedule 13.10.2015

Я недавно изучаю двойной кватернион и только что наткнулся на тот же вопрос, я постараюсь дать свой ответ, поправьте меня, если что-то не так.

Чтобы нормализовать двойственный кватернион, скажем, Q=a+eb, мы можем просто разделить его на ||Q||. Нам нужно рассчитать норму Q, это можно сделать по следующей формуле:

норма двойственного кватерниона

Тогда мы можем вычислить нормализацию по

нормализовать двойной кватернион

person ashen    schedule 22.02.2015