OpenGL — 3D Вращение вокруг локальных осей

#c #opengl #3d #rotation

#c #opengl #3D #вращение

Вопрос:

Предыстория: Я работал над проблемой вращения 3D-объекта вокруг его локальных осей, используя OpenGL. После тщательного поиска на разных форумах математической модели для обновления осей по мере вращения x / y / z я обнаружил, что это самый полезный ресурс.

http://nehe.gamedev.net/article/camera_class_tutorial/18010/

Проблема: в настоящее время я натыкаюсь на довольно тривиальную проблему. Пример из ресурса, упомянутого выше, выполняет поворот на 45 градусов вокруг оси y; следовательно, оси x и z необходимо обновить. Новая ось x вычисляется как (0.707, 0, 0.707), что имеет смысл. Ось z равна (-0.707, 0, 0.707), что также интуитивно понятно. Соответствующими командами gl являются:

 glRotatef(x_rot, 0.707, 0, 0.707);
glRotatef(y_rot, 0, 1, 0);
glRotatef(z_rot, -0.707, 0, 0.707);
 

Теперь я сначала поворачиваюсь вокруг оси y на 45 градусов. После этого x-образный поворот выглядит хорошо. Он находится вокруг обновленной (локальной) оси, как и предполагалось.

Затем я удаляю x-вращение; но когда я применяю z-вращение, это выглядит неправильно. Он не вращается вдоль локальной оси z. Математически ось выглядит правильно, но я не уверен, что может быть не так графически.

Редактировать:

Пример находится примерно в середине этой страницы.

Комментарии:

1. «но когда я применяю z-вращение, это выглядит неправильно» Как так? Что именно не так?

2. @ColonelThirtyTwo: вращение происходит не вокруг новой оси z. Скорее всего, это происходит вокруг другой (случайной) оси.

3. Вы гарантируете, что нажимаете текущую матрицу перед применением поворота? Обычно вы вызываете glPushMatrix(), сбрасываете текущую матрицу modelview, затем вызываете glPopMatrix(), чтобы убедиться, что вы не получаете никаких других матриц при вращении. Вам также нужно убедиться, что вы не сталкиваетесь с блокировкой кардана, поскольку вы используете углы Эйлера. В любом случае, нам нужно было бы увидеть больше вашего кода в вопросе, чтобы иметь возможность прокомментировать проблему.

4. @stix: матрицы push / pop — обо всем позаботились. Я почти уверен, что не столкнулся с блокировкой кардана, так как я вращаюсь только вокруг 2 осей.

5. @Iceman: Ты помнишь какую-нибудь линейную алгебру из школы? Если это так, сделайте себе одолжение, убедитесь, что ваша матрица представления является идентичной, и выводите текущие матрицы на консоль после каждого шага с помощью float p[16]; glGet(GL_MODELVIEW_MATRIX, p); и просто считайте значения, которые вы ищете, из полученной матрицы. Имейте в виду, что OpenGL использует порядок столбцов.