2016-10-03 6 views
1

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

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

EDIT: Кроме того, кажется, косые другие объекты (которые вращаются), когда они нарисованы:

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

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

matrices

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

//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: Обратите внимание, что эти матрицы преобразования являются для объектов, и не камеры.

ответ

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.

+0

Ох. Дух ... Спасибо. Я не понимал, что забыл изменить «X» на «Y», затем на «Z» –

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

  • Нет связанных вопросов^_^