GLM 围绕原点和对象本身旋转对象

GLM rotates objects around origin and around of the object itself

我正在尝试在它们的 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;
}

我尝试将 translaterotatescale 函数按不同顺序排列,但无济于事。只有奇怪的行为。

这就是我如何遍历对象并绘制它们:

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);
}

结果:

如您所见,顶部的物体仅围绕自身旋转,而下方的其他物体围绕世界原点旋转得越多?

我读过许多类似的帖子,解释了矩阵相乘的顺序,但似乎没有任何帮助,我不禁认为这是我忽略的简单到愚蠢的事情。

原来问题出在顶点着色器中。

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

我不小心将模型矩阵相乘了两次。 fragPosmodel 与顶点相乘的结果。下面两行我用 mvp 乘以 fragPos,所以计算结果是 model * view * projection * model.

为了解决这个问题,我将 mvp 分开并在着色器中将每个矩阵设置为自己的制服并将行 gl_Position = mvp * vec4(fragPos, 1.0f); 更改为 gl_Position = projection * view * vec4(fragPos, 1.0);