11

我在开始使用 glm 时遇到了一些非常简单的错误(在 VS2010 中)。我有这个短代码:

glm::mat4 translate = glm::translate(glm::mat4(1.f), glm::vec3(2.f, 0.f, 0.f));
glm::vec4 vector(1.f,1.f,1.f,0.f);
glm::vec4 transformedVector = translate * vector;

变换向量的结果与其原始值相同(1.f, 1.f, 1.f, 0.f)。我不知道我在这里缺少什么。我已经尝试过旋转矩阵并且工作正常,该点已正确转换。

glm::mat4 rotate = glm::rotate(glm::mat4(1.f), 90.f, glm::vec3(0.f, 0.f, 1.f));
glm::vec4 vector(1.f, 1.f, 1.f, 0.f);
glm::vec4 transformedVector = rotate * vector;

好的,我发现了问题所在。我想翻译一个顶点而不是一个向量,在这种情况下,我必须将 w 值设置为 1。

4

1 回答 1

26

你忘记了投影坐标。所以最后一个组件

glm::vec4 vector

应该是 1。所以更正只是这样做:

glm::mat4 translate = glm::translate(glm::mat4(1.f), glm::vec3(2.f, 0.f, 0.f));
glm::vec4 vector(1.f,1.f,1.f,1.f);
glm::vec4 transformedVector = translate * vector;

这是由于投影坐标的工作方式,本质上是从投影坐标(vec4)到法线坐标(vec3)除以 w 分量。(如果它是零,你就不能这样做。)

它适用于旋转但不适用于平移的原因是因为在投影空间中旋转与正常空间中的“相同”,但平移不同。

我刚刚注意到你解决了你的错误,但我认为解释可能会有所帮助。

于 2013-09-24T18:04:27.463 回答