Opengl 使用glMultMatrix围绕固定点旋转对象
围绕(x,y,0)旋转对象://2D 对吗?! 用“glMultMatrix”代替“GLTRANSTEF”和“glRotatef”怎么样 矩阵序列正确吗 矩阵序列正确吗 第一个代码段的顺序正确,但第二个代码段的顺序不正确。正确的顺序是Opengl 使用glMultMatrix围绕固定点旋转对象,opengl,matrix,Opengl,Matrix,围绕(x,y,0)旋转对象://2D 对吗?! 用“glMultMatrix”代替“GLTRANSTEF”和“glRotatef”怎么样 矩阵序列正确吗 矩阵序列正确吗 第一个代码段的顺序正确,但第二个代码段的顺序不正确。正确的顺序是 glMultMatrix(Translation_Matrix); // glTranslatef(x, y, 0); glMultMatrix(Rotation_Matrix); // glRotatef(theta, 0.0, 1.0
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将它们相乘。假设当前矩阵是ModelView矩阵,并且对象的中心位于(x,y,0),则平移、旋转和向后平移的第一个序列似乎是正确的序列
当使用glMultMatrix时,我认为序列不会反转,但它们与第一个序列相同。由于前面的答案看起来都不完全正确和完整,让我试试: 要理解的关键点是,变换将按指定顺序的相反顺序应用于顶点。指定的最后一个变换是应用于顶点的第一个变换 这既适用于使用调用,如
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
的版本看起来是正确的,因为您已经按此顺序指定了转换。glMultMatrix(m1);glMultMatrix(m2);glMultMatrix(m3)代码>结果是:m1.m2.m3.v(其中v是顶点)m3是应用于vI的第一个矩阵,我认为这是向后的。请记住,指定的最后一个矩阵是首先应用于顶点的矩阵<需要首先应用代码>负平移矩阵
将所需旋转中心移动到原点,然后旋转,然后将平移移回旋转中心。据我所知,原始海报的顺序是正确的,而这张是错误的。好吧,你确定了顺序。但你仍然说,原始海报使用的序列是不正确的,即使它与你现在的序列相同。我添加了我自己的答案,希望能澄清整件事。@RetoKoradi:海报在他的问题中有两个相反的顺序。我指的是第一个。只是为了澄清一些事情,矩阵乘法的应用顺序与所写的相同,不同的是要乘法的矩阵放在运算符的另一边。从数学上讲,您通常会将[OldMat]*[NewMat]相乘,但GL会将[NewMat]*[OldMat](相乘后)相乘。这个复合乘法变成:(3)[平移-x-y]*[(2)[旋转]*[(1)[平移+x+y]*[原始]]。所有操作都以相同的顺序进行,但操作数的位置是交换的,矩阵乘法不是交换的。
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);
glTranslatef(x, y, 0);
glRotatef(theta, 0.0, 0.0, 1.0);
glTranslatef(-x, -y, 0);