Как работает этот код вращения Quaternion? - PullRequest
8 голосов
/ 08 июня 2011

Я пытаюсь понять, как работают кватернионные вращения, я нашел этот мини-учебник http://www.julapy.com/blog/2008/12/22/quaternion-rotation/, но он делает некоторые предположения, что я не могу тренироваться, например, как я могу сделать " отработатьвекторы вращения вокруг каждой оси, просто вращая вектор вокруг оси."и как он вычисляет angleDegreesX, angleDegreesY и angleDegreesZ?

Может ли кто-нибудь предоставить рабочий пример или объяснение?

Ответы [ 2 ]

18 голосов
/ 08 июня 2011

Кратчайшее из возможных заключений: кватернион - это просто сокращение матрицы вращения.В то время как матрица 4x4 требует 16 отдельных значений, кватернион может представлять точно такое же вращение в 4.

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

Чтобы получить немного больше подробностей, давайте обратимся к статье Википедии :

Единичные кватернионы обеспечивают удобную математическую запись для представления ориентации и поворота объектов втри измерения.По сравнению с углами Эйлера их проще составить и избежать проблемы блокировки карданного подвеса.По сравнению с матрицами вращения они более численно устойчивы и могут быть более эффективными

Из этого вступительного абзаца неясно, что кватернион не только удобен, но и уникален.Если у вас есть определенная ориентация объекта, крутящаяся на любом количестве осей, существует один уникальный кватернион, который представляет эту ориентацию.

Опять же, для математически наклонного, мой комментарий уникальности выше предполагает правильностьвращениеСуществует эквивалентный левый кватернион, который вращается в противоположном направлении вокруг противоположной оси.

В целях простого объяснения это является чем-то вроде различия без разницы.

Если вы хотите создать простой кватернион, представляющий вращение вокруг оси, вот несколько коротких шагов, которые доставят вас туда:

  1. Выберите вашу ось вращенияv = {x, y, z}.Просто для вежливости, пожалуйста, выберите единичный вектор: если он еще не имеет длины 1, разделите все компоненты на длину v.
  2. Выберите угол поворота, который вы хотите повернуть вокруг этой оси, иназовите это theta.
  3. Эквивалент кватернионов в эквивалентных единицах можно вычислить, используя приведенный ниже пример кода:

Конструкция кватернионов:

q = { cos(theta/2.0),     // This is the angle component 
      sin(theta/2.0) * x, // Remember, angle is in radians, not degrees!
      sin(theta/2.0) * y, // These capture the axis of rotation
      sin(theta/2.0) * z};

Обратите внимание на эти деления подва: они гарантируют, что в повороте нет путаницы.В случае матрицы нормального вращения поворот на 90 градусов вправо аналогичен повороту на 270 градусов влево. Кватернионы, эквивалентные этим двум поворотам, различны: нельзя смешивать одно с другим.

РЕДАКТИРОВАТЬ: отвечая на вопрос в комментариях:

Давайте упростим задачу, установив следующую систему координат:

  1. Выберите центр экрана в качестве источника (мы 'вращается вокруг этого).
  2. Ось X направлена ​​вправо
  3. Ось Y направлена ​​вверх (вверху экрана)
  4. Ось Z направлена ​​за пределы экрана наваше лицо (образуя красивую правую систему координат).

Итак, если у нас есть пример объекта (скажем, стрелка), который начинается с указания вправо (положительная ось х).Если мы переместим мышь вверх от оси x, мышь предоставит нам положительный x и положительный y.Итак, прорабатывая последовательность шагов:

double theta = Math.atan2(y, x);
// Remember, Z axis = {0, 0, 1};
// pseudo code for the quaternion:
q = { cos(theta/2.0),     // This is the angle component 
      sin(theta/2.0) * 0, // As you can see, the zero components are ignored
      sin(theta/2.0) * 0, // Left them in for clarity.
      sin(theta/2.0) * 1.0};
0 голосов
/ 08 июня 2011

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

Линия

angleX = angleDegreesX * DEGTORAD;

просто преобразует представление градусов в представление в радианах с помощью простой формы (см. эту запись в Википедии о радианах )

Более подробную информацию и примеры матриц вращения можно найти здесь: Вращение вокруг произвольных осей

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...