我开始使用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;
transformedVector的结果与其原始值(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。
答案 0 :(得分:22)
你忘记了投影坐标。
的最后一个组成部分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)到除以w分量的法线坐标(vec3)。 (如果它为零则你不能这样做。)
它适用于旋转但不适用于平移的原因是因为在投影空间中旋转与正常空间“相同”,但翻译是不同的。
我刚刚注意到你解决了你的错误,但我认为解释可能有所帮助。