如果我想围绕z轴旋转对象,然后翻译它,我必须
glm::mat4 transform;
GLfloat angle = 90f;
transform = glm::rotate(transform, angle, glm::vec3(0.0f, 0.0f, 1.0f));
transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));
但它向后工作,它首先旋转然后翻译,所以我需要把它写成
glm::mat4 transform;
GLfloat angle = 90f;
transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));
transform = glm::rotate(transform, angle, glm::vec3(0.0f, 0.0f, 1.0f));
这背后的数学运算如何?为什么我必须反过来组合矩阵以达到预期的效果?
答案 0 :(得分:12)
从直观的角度来看,你是绝对正确的:变换必须采用与人们相反的方式来应用。原因很简单:
在glm / OpenGL中,假设所有向量都是列向量,因此将矩阵形式的变换(M
)应用于向量t
可以写成如下:
t' = M * t
现在假设我们首先想要翻译(T
)然后旋转(R
)。我们现在可以像
t' = T * t //Translate
t'' = R * t' //Rotate result Translation
当我们想要结合两个转换时,我们在第二行替换t'
并得到:
t'' = R * (T * t) = (R * T) * t
正如您所看到的,首先应用的操作是最后写入的(或者更接近向量)。同样的原则可以应用于人们想要的多个矩阵。
注意,如果向量被视为行向量,则整个矩阵顺序将发生变化。
t' = t * M //General case
让我们看一下与上面相同的例子,但这次使用行向量:
t' = t * T
t'' = t' * R
t'' = (t * T) * R = t * (T * R)
结论:无论何时考虑转换和向量,请记住首先应用的操作必须写得更接近向量。