使用glMultMatrix在固定点周围旋转对象

时间:2014-05-03 09:20:13

标签: opengl matrix

围绕(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);

矩阵序列是否正确?!

3 个答案:

答案 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)

由于之前的答案都没有完全正确和完整,让我试试:

要理解的关键点是变换应用于您指定它们的顺序的顶点。您指定的最后一个变换是应用于顶点的第一个变换

这适用于使用glTranslateglRotate等通话,以及使用glMultMatrixglTranslateglRotate是构建特定类型转换的便捷函数,但它们的运行方式与glMultMatrix类似。

在您的示例中,要围绕任意点旋转,您需要先转换顶点,使旋转点移动到原点,即您想要转换(-x,-y,0)。然后你应用旋转。然后将原点转换回旋转点,这意味着通过(x,y,0)进行平移。

现在,由于我们需要以相反的顺序指定这些步骤,这意味着您的初始转换集的顺序错误。它必须是:

glTranslatef(x, y, 0);
glRotatef(theta, 0.0, 0.0, 1.0); 
glTranslatef(-x, -y, 0);

使用glMultMatrix的版本看起来是正确的,因为您已经按此顺序指定了转换。