Формы становятся растянутыми при повороте

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

Вот скриншот сцены без вращающихся квадратов рядом с одним с теми же квадратами, один повернут.

Я не уверен, что вызывает эти проблемы. Я установил gluPerspective так:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glMatrixMode(GL_MODELVIEW);

 float ratio = (float)WIDTH / (float)HEIGHT;
 gluPerspective(45, ratio, -1, 1);

Я ввожу матрицу преобразования в шейдер следующим образом:

float xTranslated = (e->body->GetPosition().x * 100 / SCREEN_WIDTH);
float yTranslated = (e->body->GetPosition().y * 100 / SCREEN_HEIGHT);
float rotated = e->body->GetAngle();

glm::mat4 transform;
transform = glm::translate(transform, glm::vec3(xTranslated, yTranslated, 0.0f));
transform = glm::rotate(transform, rotated, glm::vec3(0.0f, 0.0f, 1.0f));
transform = glm::scale(transform, glm::vec3(1.0f, 1.0f, 1.0f));

GLint transformLoc = glGetUniformLocation(shaderProgram, "trans");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

И я инициализировал вершины своих фигур следующим образом:

GLfloat * verts = vertices;
GLfloat floatArray[20] = {
 -0.5f * w, 0.5f* h, 1.0f, 0.0f, 1.0f, 
 0.5f * w, 0.5f* h, 1.0f, 0.0f, 1.0f, 
 0.5f * w, -0.5f* h, 1.0f, 0.0f, 1.0f, 
 -0.5f* w, -0.5f* h, 1.0f, 0.0f, 1.0f 
};
for (GLfloat f : floatArray){
 *verts++ = f;
}

Vertex shader:

#version 150

in vec2 position;
in vec3 color;

out vec3 Color;

uniform mat4 trans;

void main() {
 Color = color;
 gl_Position = trans * vec4(position, 0.0, 1.0);
}

Может ли кто-нибудь обнаружить что-то, что может вызвать эту проблему?

1 ответ

Мне удалось исправить мою проблему, выполнив несколько вещей.

Во-первых, я создал матрицу проекций и умножил ее на мою матрицу преобразования:

glm::mat4 transform, projection, mvp;
transform = glm::translate(transform, glm::vec3(xTranslated, yTranslated, 0.0f));
transform = glm::rotate(transform, rotated, glm::vec3(0.0f, 0.0f, 1.0f));
transform = glm::scale(transform, glm::vec3(1.0f, 1.0f, 1.0f));

projection = glm::ortho(-ASPECT_RATIO, ASPECT_RATIO, -1.0f, 1.0f, -1.0f, 1.0f);

mvp = projection * transform ;

Затем я передаю эту матрицу mvp в свой шейдер.

Я также умножаю x координаты всех моих вершин на соотношение сторон моего экрана:

float xTranslated = (e->body->GetPosition().x * 100 / SCREEN_WIDTH) * ASPECT_RATIO;

И сделайте то же самое, когда я создам буфер вершин:

GLfloat floatArray[20] = {
 -0.5f * w * ASPECT_RATIO, 0.5f *h, 1.0f, 0.0f, 1.0f, // Top-left
 0.5f *w* ASPECT_RATIO, 0.5f *h, 1.0f, 0.0f, 1.0f, // Top-right
 0.5f *w* ASPECT_RATIO, -0.5f *h, 1.0f, 0.0f, 1.0f, // Bottom-right
 -0.5f *w* ASPECT_RATIO, -0.5f *h, 1.0f, 0.0f, 1.0f // Bottom-left
};

И тада:

licensed under cc by-sa 3.0 with attribution.