Я пытаюсь повернуть объект на собственной оси с помощью матриц, но у меня возникла проблема. Вращение на оси 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();
Матрица вращения выглядит правильно. Но какова цель «перевода»? Что произойдет, если вы удалите эту строку функции draw? –
@DavidK «Перевод» - это vec3 в GLSL, используемый для перемещения/позиционирования модели в мире. Я использую его так же, как glTranslatef (float, float, float). – SpicyWeenie
Казалось, что это что-то в этом роде. Я просто не видел эту конкретную нотацию нигде. Но, кажется, вы переводите перед поворотом, что может вызвать проблемы (как указано в ответе @Sunius). Вот почему я спрашиваю, что произойдет, если вы вообще не переводите. –