Вектор вращения OpenGL из матрицы

Итак, вот что у меня есть:

  • абстрактный класс «Object», который я создал в рамках, чтобы использовать его в качестве базового класса для всех 3D-объектов.

  • член Matrix4 этого класса, единственная цель которого - хранить информацию о вращении объекта.

  • некоторые функции, которые умножают матрицу: для каждого поворота по рысканью, тангажу и крену (как глобальному, так и локальному) я создал метод, который умножает указанную выше матрицу поворота на новую матрицу.

например: если вы локально поворачиваете объект на 45 градусов в направлении против часовой стрелки, то

rotMatrix = newRotationZMatrix(45) * rotMatrix;

Я хотел бы знать, как лучше всего получить глобальное вращение объекта как вектора - вообще говоря, как получить углы поворота вокруг X, Y и Z из матрицы преобразования, которая содержит ТОЛЬКО повороты.


person cantrem    schedule 21.08.2010    source источник


Ответы (2)


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

person Dr. Snoopy    schedule 21.08.2010
comment
Спасибо! Кажется, это то, что мне нужно, и это достаточно любопытно, это очень близко к тому, что, как я думал, должен быть ответ. Я буду смотреть в него. - person cantrem; 21.08.2010
comment
В случае, если это помогает при поиске, этот метод обычно называют разложением матриц. - person dbr; 16.08.2012

У меня похожий класс. Для меня это одна из самых увлекательных частей работы с 3D-матрицей.

Что ж, перейдем к ответу. Я работаю с OpenGL ES, поэтому производительность для меня важна. Я делаю рутину, тестирую, тестирую, стресс-тесты, перестраиваю всю процедуру и тестирую, тестирую ... пока не найду лучший способ сэкономить память и повысить производительность.

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

• Сохраните значения поворота в переменных, прежде чем помещать их в матрицу.

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

person user464230    schedule 03.11.2010