Размер объекта изменяется при вращении его вокруг оси в OpenGL

#opengl #graphics #rotation #transformation

#opengl #графика #вращение #преобразование

Вопрос:

У меня есть треугольник :

 static const GLfloat g_vertex_buffer_data[] = { 
-1.0f, -1.0f, 0.0f, 
1.0f, -1.0f, 0.0f, 
0.0f, 1.0f, 0.0f
};
  

Я перевел свой треугольник по оси z. Затем я попробовал повернуть его вокруг осей x и y:

 mat4 rotationMatrix = glm::rotate(mat4(1.0f), rotation, vec3(1.0f, 0.0f, 0.0f));
mat4 translationMatrix = glm::translate(mat4(1.0f), vec3(position.x, position.y, -2.3f));

mat4 projectionMatrix = glm::perspective(90.0f, WindowWidth/WindowHeight, 1.0f, 1000.0f);
  

Вот мой вершинный шейдер:

 #version 330 core


layout(location = 0) in vec3 vertexPosition_modelspace;
uniform mat4 rotationMatrix;
uniform mat4 translationMatrix;
uniform mat4 projectionMatrix;

void main()
{
    gl_Position = projectionMatrix*rotationMatrix*translationMatrix* vec4(vertexPosition_modelspace,1.0f);

}
  

Поскольку я не могу добавлять изображения, я должен добавить ссылки на изображения:

Без преобразования:https://www.dropbox.com/s/1eompnmjauvll9x/3.png

Вращение вокруг оси x:https://www.dropbox.com/s/9bpqb6nfudruuhx/ilk.png

Вращение вокруг оси y: www.dropbox.com/s/xxk9ofxfp4zk8ta/2.png

Мне это кажется ненормальным. Почему это происходит?

Комментарии:

1. Вы уверены, что это действительно ошибка? похоже, что это может быть просто результатом вашей матрицы проекции. Попробуйте повернуть куб на 1 единицу вокруг своей оси на расстоянии 3 единиц и посмотрите, не искажается ли он.

2. Этот поток мертв, но вот некоторые вещи, на которые следует обратить внимание. Всегда убедитесь, что вы выполняете преобразования для положения, поворота и масштаба отдельно. Как и в случае создания отдельной матрицы для каждой из них, а затем последующего умножения, а не выполнения всех сразу, и убедитесь, что при вращении вашего объекта вы не используете кватернион, если это так, вы должны вращать его с помощью функции rotate, а не изменять значения XYZ, как если бы вы использовали углы Эйлера.

Ответ №1:

Для меня это выглядит нормально.

Поскольку вы не используете матрицу просмотра, результат вашего преобразования (и, следовательно, координаты вершин, которые вы увидите на экране после проекции) покажет треугольник, который сильно искажается (увеличивается в направлении Y) по мере поворота к вам, и наоборот, уменьшается, когда он поворачивается от вас.

Если вы хотите убедиться, что ваше преобразование правильное, добавьте матрицу просмотра :

 glm::mat4 viewMatrix = glm::lookAt(glm::vec3(5.0), glm::vec3(0.0), glm::vec3(0.0, 1.0, 0.0));
  

Вы можете отправить его в виде формы в свой шейдер и сделать его похожим на это :

 gl_Position = projectionMatrix*viewMatrix*rotationMatrix*translationMatrix* vec4(vertexPosition_modelspace,1.0f);
  

Если вы все еще видите эффект искажения, то проблема действительно существует, но из вашего кода я предполагаю, что все это уже работает хорошо 🙂