【问题标题】:GLM rotates objects around origin and around of the object itselfGLM 围绕原点和对象本身旋转对象
【发布时间】:2020-04-30 16:44:09
【问题描述】:

我正在尝试在 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);
}

结果:

您可以看到顶部的对象仅围绕自己旋转,而其他对象越低,它们围绕我认为是世界原点的旋转越多?

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

【问题讨论】:

  • 如果你做translate 然后rotate 对象围绕对象的(0,0)旋转。如果您先执行rotate,然后执行translate,则对象将围绕世界的(0,0) 旋转。
  • 试试这个顺序,先缩放再旋转,再翻译
  • @Summit No. 必须是T * R * SR * T * S!无论如何,规模必须是第一位的。
  • @Rabbid76 正如我所提到的,我尝试使用translaterotatescale 以不同的顺序(实际上是所有顺序)计算变换比例。
  • @xlog 正如我提到的,它围绕 (0, 0, 0) 旋转。 (0, 0, 0) 分别是物体的网格中心吗?还是 (0, 0, 0) 分别是一组对象的网格的角点?

标签: c++ opengl rotation transform glm-math


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2015-07-14
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多