【发布时间】: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;
}
我尝试将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);
}
您可以看到顶部的对象仅围绕自己旋转,而其他对象越低,它们围绕我认为是世界原点的旋转越多?
我已经阅读了许多类似的帖子,解释了矩阵相乘的顺序,但似乎没有任何帮助,而且我不禁认为这是我忽略的愚蠢简单的事情。
【问题讨论】:
-
如果你做
translate然后rotate对象围绕对象的(0,0)旋转。如果您先执行rotate,然后执行translate,则对象将围绕世界的(0,0) 旋转。 -
试试这个顺序,先缩放再旋转,再翻译
-
@Summit No. 必须是
T * R * S或R * T * S!无论如何,规模必须是第一位的。 -
@Rabbid76 正如我所提到的,我尝试使用
translate、rotate和scale以不同的顺序(实际上是所有顺序)计算变换比例。 -
@xlog 正如我提到的,它围绕 (0, 0, 0) 旋转。 (0, 0, 0) 分别是物体的网格中心吗?还是 (0, 0, 0) 分别是一组对象的网格的角点?
标签: c++ opengl rotation transform glm-math