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;
}
我尝试将 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);
}
结果:
如您所见,顶部的物体仅围绕自身旋转,而下方的其他物体围绕世界原点旋转得越多?
我读过许多类似的帖子,解释了矩阵相乘的顺序,但似乎没有任何帮助,我不禁认为这是我忽略的简单到愚蠢的事情。
原来问题出在顶点着色器中。
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);
我正在尝试在它们的 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);
}
结果:
如您所见,顶部的物体仅围绕自身旋转,而下方的其他物体围绕世界原点旋转得越多?
我读过许多类似的帖子,解释了矩阵相乘的顺序,但似乎没有任何帮助,我不禁认为这是我忽略的简单到愚蠢的事情。
原来问题出在顶点着色器中。
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);