Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 使用glMultMatrix围绕固定点旋转对象_Opengl_Matrix - Fatal编程技术网

Opengl 使用glMultMatrix围绕固定点旋转对象

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

围绕(x,y,0)旋转对象://2D

对吗?! 用“glMultMatrix”代替“GLTRANSTEF”和“glRotatef”怎么样

矩阵序列正确吗

矩阵序列正确吗

第一个代码段的顺序正确,但第二个代码段的顺序不正确。正确的顺序是

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);