Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Помогите с кватернионами


Автор: GreyBeholder 28.11.2011, 01:45
Мыслительный процесс зашел в тупик smile Перечитал "всю сеть" про кватернионы и про матрицы вращения. Для понимания решил разобрать простой пример:
- Повернуть вектор (x,y,z) - > (5,10,15) вокруг оси Х на 29 градусов.
    Первое что сделал - повернул с помощью матрицы поворота с углами Эйлера - Получилось!!!

                                 |1     0           0       |
             [5, 10, 15] X |0  cos(a)   -sin(a)  |  =  [5, 16.0183, 8.2712]
                                 |0  sin(a)     cos(a) |

 Построил в Solidworks - Все верно.

Дальше пришло время сделать это используя кватернион, т.к. в дальнейшем будет задача поворачивать по 3-м углам Эйлера, а там всякие неприятности...
Для перехода от углов Эйлера к кватернионам использую:

Q.x = X*sin(a/2)
Q.y = Y*sin(a/2)
Q.z = Z*sin(a/2)
Q.w = cos(a/2)

Для своего случая получил кватернион [sin(29/2), sin(0/2), sin(0/2), cos(29/2)]=[0.25, 0, 0, 0.968]

Как мне пристроить "ЭТО" к моему вектору [5, 10, 15] ????  smile 

В дальнейшем (когда прояснится ситуация) планирую умножать 3 кватерниона с углами поворота вокруг осей  XYZ чтобы получить кротчайший путь поворота. Но пока незнаю КАК ЭТО сделать. Пожалуйста направте на нужный путь.
Спасибо.

Автор: maxdiver 29.11.2011, 02:20
Чтобы по кватерниону поворота q и данной точке p узнать, в какую точку p' перейдёт эта точка p, надо посчитать:
Код

p' = q * p * ~q

(где звездочкой обозначено кватернионное произведение; точку p мы приводим к кватерниону, просто полагая w у неё нулю; тильдой обозначен сопряжённый кватернион - т.е. когда знаки компонент x,y,z изменены на противоположные; справа в итоге получится кватернион, но у него будет нулевая компонента w).

Это называется формулой Родрига, если не ошибаюсь.


Правда, чтобы получить такой же ответ, как у вас, надо использовать угол -29. Вероятно, где-то у нас расхождение в том, по или против часовой стрелки отсчитывается угол.


Чтобы "скомбинировать" три поворота, надо перемножить соответствующие кватернионы. В каком порядке перемножать кватернионы, и как ставить скобки в этом кватернионном произведении - понять не так просто, потому что всё зависит от того, что вы подразумеваете под разными поворотами: каждый следующий поворот задан в текущей системе координат, или задан в начальной/конечной системе координат. В общем, обычно проще экспериментальным путём подобрать правильный порядок произведения для конкретной задачи, чем ломать голову.

Автор: GreyBeholder 2.12.2011, 01:14
Цитата(maxdiver @ 29.11.2011,  02:20)
Чтобы по кватерниону поворота q и данной точке p узнать, в какую точку p' перейдёт эта точка p, надо посчитать:
Код

p' = q * p * ~q

(где звездочкой обозначено кватернионное произведение; точку p мы приводим к кватерниону, просто полагая w у неё нулю; тильдой обозначен сопряжённый кватернион - т.е. когда знаки компонент x,y,z изменены на противоположные; справа в итоге получится кватернион, но у него будет нулевая компонента w).

Это называется формулой Родрига, если не ошибаюсь.


Правда, чтобы получить такой же ответ, как у вас, надо использовать угол -29. Вероятно, где-то у нас расхождение в том, по или против часовой стрелки отсчитывается угол.


Чтобы "скомбинировать" три поворота, надо перемножить соответствующие кватернионы. В каком порядке перемножать кватернионы, и как ставить скобки в этом кватернионном произведении - понять не так просто, потому что всё зависит от того, что вы подразумеваете под разными поворотами: каждый следующий поворот задан в текущей системе координат, или задан в начальной/конечной системе координат. В общем, обычно проще экспериментальным путём подобрать правильный порядок произведения для конкретной задачи, чем ломать голову.

Огромное спасибо. Все получилось. Сделал как написано. Вот и недостающее звено... !!! smile 

И угол действительно меняет знак.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)