Преобразовать матрицу OpenGL 4x4 в углы поворота - PullRequest
2 голосов
/ 29 июля 2011

Я извлекаю в OpenGL матрицу модели с glGetFloatv (GL_MODELVIEW_MATRIX, (float *) x)

И хотел бы извлечь из полученной матрицы 4x4 вращения по осям x, y и z. Как я могу это сделать ? Спасибо!

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

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

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

1 голос
/ 29 июля 2011

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

Для моего приложения я интерпретировал замечательный алгоритм Кена Шумейка, он один из немногих, которые поддерживают произвольные порядки вращения.Это с 93 года, так что это в чистом C-коде - не для слабонервных!

http://tog.acm.org/resources/GraphicsGems/gemsiv/euler_angle/

0 голосов
/ 29 июля 2011

Что-то вроде этого должно дать вам то, что вы ищете.

final double roll = Math.atan2(2 * (quat.getW() * quat.getX() + quat.getY() * quat.getZ()),
            1 - 2 * (quat.getX() * quat.getX() + quat.getY() * quat.getY()));
final double pitch = Math.asin(2 * (quat.getW() * quat.getY() - quat.getZ() * quat.getY()));
final double yaw = Math.atan2(2 * (quat.getW() * quat.getZ() + quat.getX() * quat.getY()), 1 - 2 * (quat.getY()
            * quat.getY() + quat.getZ() * quat.getZ()));

Я использую это как служебную функцию для распечатки углов камеры, когда я использую SLERP для интерполяции между двумя кватернионамимы получили 2 матрицы 4x4 (т.е. перемещение камеры между двумя 3D точками).

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