GLM вращает объекты вокруг источника и вокруг самого объекта - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь повернуть кучу объектов по оси X.

Вот как я вычисляю преобразование объекта:

glm::mat4 GameObject::getTransform(float angle) {
  glm::mat4 model = glm::mat4(1.0f);
  model = glm::translate(model, position);
  model = glm::rotate(model, angle, glm::vec3(1.0f, 0.0f, 0.0f));
  model = glm::scale(model, scaleValue);
  return model;
}

Я пытался поместить translate, rotate, scale функционируют в другом порядке безрезультатно. Только странное поведение.

Вот как я перебираю объекты и рисую их:

for (auto row : objectRows) {
  for (auto object : row) {
    glm::mat4 model = object->getTransform(glfwGetTime());
    glm::mat4 mvp = projection * view * model;
    mainShader.setMat4("model", model);
    mainShader.setMat4("mvp", mvp);
    mainShader.setVec3("objectColour", object->colour);
    object->mesh.draw(mainShader);
  }
}

Вершинный шейдер:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;

out vec3 fragPos;
out vec3 normal;

uniform mat4 model;
uniform mat4 mvp;

void main()
{
    fragPos = vec3(model * vec4(aPos, 1.0));
    normal = mat3(transpose(inverse(model))) * aNormal;
    gl_Position = mvp * vec4(fragPos, 1.0f);
}

И результат: OpenGL/glm rotating bug

Как вы можете видеть, что объекты наверху вращаются только вокруг себя, и чем ниже другие объекты, тем больше они вращаются вокруг того, что я считаю точкой мирового происхождения?

Я прочитал много похожих постов, объясняющих порядок умножения матриц, но, похоже, ничего не помогает, и я не могу не думать, что это что-то глупо простое, что я пропускаю.

1 Ответ

0 голосов
/ 15 января 2020

Оказывается, проблема была в вершинном шейдере.

void main()
{
    fragPos = vec3(model * vec4(aPos, 1.0));
    normal = mat3(transpose(inverse(model))) * aNormal;
    gl_Position = mvp * vec4(fragPos, 1.0f);
}

Я случайно умножил матрицу модели в два раза. fragPos является результатом умножения model на вершину. На две строки ниже я умножаю mvp на fragPos, поэтому вычисление равно model * view * projection * model.

Чтобы исправить это, я отделил mvp и установил каждую матрицу как свою собственную униформу в шейдере и изменил строку gl_Position = mvp * vec4(fragPos, 1.0f); до gl_Position = projection * view * vec4(fragPos, 1.0);

...