Вращение 2D opengl вызывает искажение спрайта

Я новичок в использовании OpenGL ES 2.0. Также я использую iPhone и математическую библиотеку GLM. Насколько я знаю, я часто использую это руководство: http://tomdalling.com/blog/modern-opengl/03-matrices-depth-buffering-animation/ Но мне было трудно найти учебник по 2D OpenGL.

Я пытаюсь повернуть 2D-спрайт, но изображение искажается. Например, при угле поворота 0 градусов: http://i.imgur.com/yBTN2ST.png и под углом 45 градусов: http://i.imgur.com/cY5IJcg.png< /а>

В моем классе спрайтов

glm::mat4 projection = glm::ortho(0.0f, 480.0f, 0.0f, 320.0f);
glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, glm::value_ptr(projection));

glm::mat4 newModel = glm::rotate(glm::mat4(), 0.0f, glm::vec3(0, 0, 1));
glUniformMatrix4fv(modelUniform, 1, GL_FALSE, value_ptr(newModel));

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);


В моем вершинном шейдере

vec4 newPosition = vec4(position + offset, 0.0, 1.0);
gl_Position = model * projection * newPosition;

Я думаю, что часть проблемы заключается в том, что изображение поворачивается без учета соотношения сторон, и я не совсем уверен, как это исправить.

Спасибо


person Eamonn    schedule 20.06.2013    source источник


Ответы (1)


Я думаю, что вы применяете свои преобразования в неправильном порядке.

Вместо:

gl_Position = model * projection * newPosition;

пытаться:

gl_Position = projection * model * newPosition;

Еще лучше (чтобы избежать умножения двух матриц 4x4 вместе):

gl_Position = projection * ( model * newPosition );

Еще лучше: умножайте свои матрицы в своем приложении и выполняйте одно умножение матрицы на вектор в своем шейдере. Вероятно, вам также следует включить перевод в матрицу.

person GuyRT    schedule 20.06.2013
comment
Я попробовал ваш код, и он, похоже, решил проблему перекоса. Однако кажется, что изображение не вращается вокруг своего центра. i.imgur.com/C2oIM96.png Не могли бы вы уточнить, что вы подразумеваете под переводом. Это перемещение матрицы? Спасибо. - person Eamonn; 20.06.2013
comment
glm::rotate создаст вращение вокруг начала координат. Чтобы повернуть вокруг другой точки, вы должны перевести эту точку в исходную точку, повернуть, а затем снова перевести обратно. Если вершины вашего спрайта определены так, что начало координат находится в центре, это довольно просто. Вы хотите объединить матрицы следующим образом: проекция * перевод * вращение. И да, перевод - это изменение позиции. - person GuyRT; 20.06.2013
comment
Понятно. Спасибо большое за вашу помощь. - person Eamonn; 20.06.2013