Я пишу программу OpenGL, и для этой программы я пытаюсь вручную написать некоторые матрицы вращения (я знаю о glm::rotate
, но это для класса, и поэтому я не могу использовать эту функцию), но это не так, t, похоже, работает так, как я предполагаю.Как правильно писать матрицы вращения вручную с помощью glm :: mat4?
Я рисую сцену с парковкой и автомобилем с шинами нарисованных отдельно, а шины двигаются с камерой вместо оставаться на месте: Как вы можете видеть, шины повернуты немного в стороне камеры , это выглядит как.
EDIT: Кроме того, кажется, косые другие объекты (которые вращаются), когда они нарисованы:
Обратите внимание на весьма перекос здания.
Насколько я понимаю, это как матрицы поворота должны выглядеть:
И это то, что я сделал в коде (части о переводе и масштабирования опущены для краткости):
//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
, как показано в закомментированными части, так что мне интересно, что я недопонимание о том, как матрицы вращения построены , Я уверен, что порядок []
является правильным, потому что я могу вручную построить матрицы для перевода и масштабирования с использованием тех же обозначений, и он правильно масштабирует и перемещает объекты.
EDIT: Обратите внимание, что эти матрицы преобразования являются для объектов, и не камеры.
Ох. Дух ... Спасибо. Я не понимал, что забыл изменить «X» на «Y», затем на «Z» –