2014-05-14 9 views
0

Я пытаюсь повернуть объект на собственной оси с помощью матриц, но у меня возникла проблема. Вращение на оси X или Y дает ожидаемые результаты, но когда дело доходит до поворота на оси Z, вся модель, по-видимому, поворачивается вокруг оси Z, как если бы под ней находился невидимый полюс, где при повороте с X или Y, невидимый полюс проходит через модель.Модель, вращающаяся по оси Z, выключена

glm::mat4 rotateMatrix(GLfloat angle, glm::vec3 axis) 
{ 
    axis = glm::normalize(axis); 
    GLfloat s = sin(angle); 
    GLfloat c = cos(angle); 
    GLfloat oc = 1.0f - c; 

    return glm::mat4(
     oc * axis.x * axis.x + c,   oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, 
     oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c,   oc * axis.y * axis.z - axis.x * s, 0.0, 
     oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c,   0.0, 
     0.0,        0.0,        0.0,        1.0 
     ); 
} 

В функции рисования:

_prog.setUniform("Translation", glm::vec3(0.0f, 20.0f, -20.0f)); 
_prog.setUniform("Rotate", rotateMatrix(45.0f, glm::vec3(0.0f, 0.0f, 1.0f))); 
_model.render(); 
+0

Матрица вращения выглядит правильно. Но какова цель «перевода»? Что произойдет, если вы удалите эту строку функции draw? –

+0

@DavidK «Перевод» - это vec3 в GLSL, используемый для перемещения/позиционирования модели в мире. Я использую его так же, как glTranslatef (float, float, float). – SpicyWeenie

+0

Казалось, что это что-то в этом роде. Я просто не видел эту конкретную нотацию нигде. Но, кажется, вы переводите перед поворотом, что может вызвать проблемы (как указано в ответе @Sunius). Вот почему я спрашиваю, что произойдет, если вы вообще не переводите. –

ответ

0

Это произойдет, если вы повернуты переведенную модель. Проверьте правильность вашего заказа на преобразование:

  1. Масштаб модели;
  2. Поворот модели;
  3. Перевести модель;

Также убедитесь, что сама модель находится в начале системы координат.

+0

Это очень зависит от того, как реализована библиотека матрицы. Если он соответствует OpenGL (что делает glm), то он является основным столбцом и использует пост-умножение. Порядок, который вы называете этими отдельными операциями в такой ситуации, отменяется. –

+0

Технически, «порядок операций» - то же самое. Сложная часть состоит в том, что если вы составляете операции вместе путем умножения матриц, помните, определяется ли первая операция самой правой или самой левой матрицей. В этом примере операции не состоят из матричного умножения, поэтому я считаю, что особая проблема не применяется. –

Смежные вопросы