OpenGL MODELVIEW手动旋转

OpenGL MODELVIEW手动旋转,opengl,graphics,matrix,rotation,Opengl,Graphics,Matrix,Rotation,对于我的图形课,我们的教授希望我们自己跟踪当前矩阵,并对其应用旋转/平移/缩放矩阵,然后使用glMatrixMode(GL_MODELVIEW)和glLoadMatrix(current_matrix)加载它。所有这些看起来都很好,但当我实际使用它时,我一直有一个问题: 如果我对某个对象应用旋转,它将正确旋转,但如果我尝试围绕y轴旋转世界视图,每个对象将仅围绕其y轴旋转 如果这是原始图像: 这就是我得到的:评论中的链接 这就是我想要得到的:评论中的链接 我要做的是,复制一份我当前的_矩阵。对当前

对于我的图形课,我们的教授希望我们自己跟踪当前矩阵,并对其应用旋转/平移/缩放矩阵,然后使用glMatrixMode(GL_MODELVIEW)和glLoadMatrix(current_matrix)加载它。所有这些看起来都很好,但当我实际使用它时,我一直有一个问题:

如果我对某个对象应用旋转,它将正确旋转,但如果我尝试围绕y轴旋转世界视图,每个对象将仅围绕其y轴旋转

如果这是原始图像:

这就是我得到的:评论中的链接

这就是我想要得到的:评论中的链接

我要做的是,复制一份我当前的_矩阵。对当前_矩阵应用旋转(将其相乘)。然后调用glMatrixMode(GL_MODELVIEW)和glLoadMatrix(transformed_matrix)。画点什么。然后将旧矩阵复制回当前_矩阵。然后调用glMatrixMode(GL_MODELVIEW)和glLoadMatrix(current_matrix)。任何帮助都太好了


另外,任务的要点是不要使用glRotate glScale和其他命令。

您最大的问题是,显然,您正在旋转最右边的对象,然后对其进行平移。您要做的是平移它,然后(围绕原点)旋转它。为此,您需要以相反的顺序应用平移和旋转。。。矩阵数学是非交换的

我所做的是,(1)复制我的 当前_矩阵。(2) 将旋转应用于 当前_矩阵(乘以它)。然后 (3) 调用glMatrixMode(GL_MODELVIEW)并 (4) glLoadMatrix(转换矩阵)

(我加上的数字)

这听起来像是在第4步中,您正在覆盖第2步的结果。在第2步之后,您是否将结果保存在某个地方,例如转换为矩阵

(5) 画点什么。然后(6)复制旧的 矩阵返回到当前_矩阵。 然后(7)调用glMatrixMode(GL_MODELVIEW) 和(8)glLoadMatrix(当前_矩阵)

绘制后发生的任何矩阵修改都不会影响屏幕上显示的内容(除非它们影响以下通过绘制循环的过程)

此外,还不清楚您在第6步中指的是什么“旧矩阵”

p.S.这是一个关于理解OpenGL中的MODELVIEW和投影矩阵的好资源:。例如:

请再次注意,OpenGL执行 反向多重变换 因此,顺序是查看变换 在建模转换之前先进行 在你的代码中。如果你想的话 旋转然后平移一个对象,放置 glTranslatef()首先,然后是glRotatef()


验证矩阵构造是否正确(将其打印到文件或类似文件),然后记住,根据使用的是post还是pre乘法,结果完全不同。如果您仍然有问题,请向我们展示一些代码。

这是我得到的:这是我想要得到的:事实上,我认为问题在于我一直使用GL_MODELVIEW而不是GL_projection。然而,您可以“修改”投影矩阵,这个答案向我强调,你并不真正理解转换管道是如何工作的……他不应该为手头的任务触摸投影矩阵!将其设置为正交或投影变换。