围绕(x,y,0):// 2D
旋转对象glTranslatef(-x, -y, 0);
glRotatef(theta, 0.0, 0.0, 1.0);
glTranslatef(x, y, 0);
是正确的吗?! 如何使用" glMultMatrix"而不是" glTranslatef"和" glRotatef" ?!
glLoadIdentity();
glMultMatrix(Translation_Matrix); //glTranslatef(x, y, 0);
glMultMatrix(Rotation_Matrix); //glRotatef(theta, 0.0, 1.0, 0.0);
glMultMatrix(Neg_Translation_Matrix); // glTranslatef(-x, -y, 0);
矩阵序列是否正确?!
答案 0 :(得分:1)
矩阵序列是否正确?!
第一个代码段的顺序是正确的,第二个代码片段的顺序是正确的。正确的顺序是
glMultMatrix(Translation_Matrix); // glTranslatef(x, y, 0);
glMultMatrix(Rotation_Matrix); // glRotatef(theta, 0.0, 1.0, 0.0);
glMultMatrix(Neg_Translation_Matrix); // glTranslatef(-x, -y, 0);
请记住,glTranslate,glRotate等可以归结为一个函数,它生成一个平移/旋转/ ...矩阵并使用glMultMatrix将它们相乘。
答案 1 :(得分:1)
假设当前矩阵是ModelView Matrix,并且对象的中心位于(x,y,0),则第一个平移,旋转,然后平移的序列似乎是正确的序列。
当使用glMultMatrix时,我不认为序列会反转,但它们与第一个序列相同。
答案 2 :(得分:1)
由于之前的答案都没有完全正确和完整,让我试试:
要理解的关键点是变换应用于您指定它们的顺序的顶点。您指定的最后一个变换是应用于顶点的第一个变换
这适用于使用glTranslate
和glRotate
等通话,以及使用glMultMatrix
。 glTranslate
和glRotate
是构建特定类型转换的便捷函数,但它们的运行方式与glMultMatrix
类似。
在您的示例中,要围绕任意点旋转,您需要先转换顶点,使旋转点移动到原点,即您想要转换(-x,-y,0)。然后你应用旋转。然后将原点转换回旋转点,这意味着通过(x,y,0)进行平移。
现在,由于我们需要以相反的顺序指定这些步骤,这意味着您的初始转换集的顺序错误。它必须是:
glTranslatef(x, y, 0);
glRotatef(theta, 0.0, 0.0, 1.0);
glTranslatef(-x, -y, 0);
使用glMultMatrix
的版本看起来是正确的,因为您已经按此顺序指定了转换。