Перевод кватерниона - PullRequest
       15

Перевод кватерниона

3 голосов
/ 21 октября 2010

(возможно, это лучше для обмена математических стеков?)

У меня есть цепочка из костей.Каждая кость имеет кончик и хвост.Следующий код вычисляет, где будет его наконечник при заданном вращении, и соответственно устанавливает следующую ссылку в позиции цепочки:

    // Quaternion is a hand-rolled class that works correctly (as far as I can tell.)
    Quaternion quat = new Quaternion(getRotationAngleDegrees(), getRotation());

    // figure out where the tip will be after applying the rotation
    Vector3f rotatedTip = quat.applyRotationTo(tip);

    // set the next bone's tail to be at this one's tip
    updateNextPosFrom(rotatedTip);

Это работает, если предполагается, что вращение происходит вокруг начала координат объектасистема.Но что, если я хочу, чтобы вращение происходило вокруг какой-то другой произвольной точки в объекте?Я не уверен, как перевести кватернион.Каков наилучший способ сделать это?

(я использую JOGL / OpenGL.)

Ответы [ 5 ]

4 голосов
/ 22 октября 2010

Кватернионы обычно используются для представления только вращений; они также не могут представлять переводы.

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

4x4 rotation matrix:
  [ r r r 0 ]
  [ r r r 0 ]  <- the r's are the 3x3 rotation matrix from the wiki article
  [ r r r 0 ]
  [ 0 0 0 1 ]
4 голосов
/ 21 октября 2010

Кватернион используется специально для обработки коэффициента вращения, но не включает перевод вообще.

Как правило, в этой ситуации вы хотите применить вращение к точке, основанной на длине «кости», но с центром в начале координат. Затем вы можете перевести поствращение в нужное место в пространстве.

3 голосов
/ 28 ноября 2012

Двойные кватернионы полезны для выражения жестких пространственных преобразований (комбинированные вращения и сдвиги.)

На основе двойных чисел (одна из алгебр Клиффорда, d = a + eb, где a, b действительные, а e являетсяравно нуль, а е ^ 2 = 0), двойные кватернионы, U + е V, может представлять линии в пространстве с U направления блока кватернион и V момент относительно опорной точки.Таким образом, двойные кватернионные линии очень похожи на линии Pluecker.

Хотя кватернионное преобразование QVQ * (Q * является кватернионным сопряжением Q) используется для поворота единичного вектора кватерниона V вокруг точки, аналогичная двойная кватернионная форма может использоваться для применения для выравнивания винтового преобразования.(жесткое вращение вокруг оси в сочетании с перемещением вдоль оси.)

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

Для такой мощи и выразительности двойные кватернионные ссылки тонки, и статья Википедии является таким же хорошим местом для начала.

3 голосов
/ 21 октября 2010
0 голосов
/ 10 февраля 2015

Редактировать: этот ответ неверный.Он утверждает свойства матрицы преобразования 4x4, которые не являются кватернионами ...

Возможно, я ошибся, но для меня (в отличие от некоторых ответов) кватернион действительно является инструментом для обработки вращений и переводы (и более).Это матрица 4х4, где последний столбец представляет перевод.Используя матричную алгебру, замените 3-вектор (x, y, z) на 4-вектор (x, y, z, 1) и вычислите преобразованный вектор по матрице.Вы обнаружите, что значения последнего столбца матрицы будут добавлены к координатам x, y, z исходного вектора, как в переводе.

Матрица 3х3 для трехмерного пространства представляет собой линейное преобразование (например, вращение вокруг начала координат).Вы не можете использовать матрицу 3x3 для аффинного преобразования, такого как перевод.Поэтому я просто понимаю кватернионы как маленький «трюк» для представления большего количества преобразований с использованием матричной алгебры.Хитрость заключается в том, чтобы добавить четвертую координату, равную 1, и использовать матрицы 4x4.Поскольку алгебра матриц остается действительной, вы можете комбинировать пространственные преобразования, умножая матрицы, что действительно важно.

...