Как правильно написать матрицы вращения вручную, используя glm::mat4?

Я пишу программу OpenGL, и для этой программы я пытаюсь написать несколько матриц вращения вручную (я знаю о glm::rotate, но это для класса, и поэтому я не могу использовать эту функцию), но, похоже, она не работает так, как я собираюсь.

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

РЕДАКТИРОВАТЬ: Кроме того, кажется, что перекос других объектов (которые вращаются), когда они рисуются:

перекос Обратите внимание на сильно перекошенное здание.

Насколько я понимаю, именно так должны выглядеть матрицы вращения:

матрицы

И это то, что я сделал в коде (части о переводе и масштабировании оставлены для краткости):

//glm::mat4 rotXMatrix = glm::rotate(rotation.x, glm::vec3(1, 0, 0));
glm::mat4 rotXMatrix = glm::mat4(1.0f);
rotXMatrix[1][1] = cos(rotation.x);
rotXMatrix[1][2] = sin(rotation.x);
rotXMatrix[2][1] = -sin(rotation.x);
rotXMatrix[2][2] = cos(rotation.x);
//glm::mat4 rotYMatrix = glm::rotate(rotation.y, glm::vec3(0, 1, 0));
glm::mat4 rotYMatrix = glm::mat4(1.0f);
rotXMatrix[0][0] = cos(rotation.y);
rotXMatrix[0][2] = -sin(rotation.y);
rotXMatrix[2][0] = sin(rotation.y);
rotXMatrix[2][2] = cos(rotation.y);
//glm::mat4 rotZMatrix = glm::rotate(rotation.z, glm::vec3(0, 0, 1));
glm::mat4 rotZMatrix = glm::mat4(1.0f);
rotXMatrix[0][0] = cos(rotation.z);
rotXMatrix[0][1] = sin(rotation.z);
rotXMatrix[1][0] = -sin(rotation.z);
rotXMatrix[1][1] = cos(rotation.z);

glm::mat4 rotMatrix = rotZMatrix * rotYMatrix * rotXMatrix;
return posMatrix * rotMatrix * scaleMatrix;

Это работает правильно, когда я не делаю это вручную (используя glm::rot как показано в закомментированных частях, поэтому мне интересно, что я неправильно понимаю, как строятся матрицы вращения. Я почти уверен, что порядок []Это правильно, потому что я могу вручную построить матрицы для перевода и масштабирования, используя те же обозначения, и это правильно масштабирует и перемещает объекты.

РЕДАКТИРОВАТЬ: Обратите внимание, что эти матрицы преобразования предназначены для объектов, а не камеры.

1 ответ

Решение

Вы модифицируете неправильные матрицы

glm::mat4 rotYMatrix = glm::mat4(1.0f);
rotXMatrix[0][0] = cos(rotation.y);
rotXMatrix[0][2] = -sin(rotation.y);
rotXMatrix[2][0] = sin(rotation.y);
rotXMatrix[2][2] = cos(rotation.y);

Вы строите rotYMatrix но изменить rotXMatrix,

Другие вопросы по тегам