对于我的图形课,我们的教授希望我们自己跟踪当前的矩阵并对其应用旋转/平移/缩放矩阵,然后使用glMatrixMode(GL_MODELVIEW)和glLoadMatrix(current_matrix)加载它。所有这一切似乎都很好,但当我真正使用它时,我一直有一个问题:
如果我对某个物体应用旋转,它将正确旋转,但如果我尝试围绕y轴旋转世界视图,则每个物体只会围绕其y轴旋转。
如果这是原始图片:http://www.glowfoto.com/static_image/17-104501L/1324/jpg/10/2010/img5/glowfoto
这就是我得到的:评论链接
这就是我想要的:评论链接
我所做的是复制我的current_matrix。将旋转应用于current_matrix(将其相乘)。然后调用glMatrixMode(GL_MODELVIEW)和glLoadMatrix(transformed_matrix)。画一些东西。然后将旧矩阵复制回current_matrix。然后调用glMatrixMode(GL_MODELVIEW)和glLoadMatrix(current_matrix)。任何帮助都会很精彩!
P.S。赋值的目的是不使用glRotate glScale和其他命令。
答案 0 :(得分:1)
那么你最大的问题是你显然是在旋转最右边的物体,然后翻译它。你要做的就是翻译然后旋转它(关于原点)。要做到这一点,你需要应用翻译并以相反的顺序旋转...矩阵数学是非交换的。
答案 1 :(得分:1)
我所做的是,(1)复制我的 current_matrix。 (2)应用旋转 current_matrix(乘以它)。然后 (3)调用glMatrixMode(GL_MODELVIEW)和 (4)glLoadMatrix(transformed_matrix)。 ...
(我添加的数字)。
听起来与步骤4一样,您将覆盖步骤2的结果。在步骤2之后,您将结果保存在某处,例如into transformed_matrix?
(5)画出一些东西。然后(6)复制旧的 矩阵回到current_matrix。 然后(7)调用glMatrixMode(GL_MODELVIEW) (8)glLoadMatrix(current_matrix)。
在绘图后发生的任何矩阵修改都不会对屏幕上显示的内容产生任何影响(除非它们影响下面的绘图循环传递)。
还不清楚你在步骤6中提到的“旧矩阵”。
P.S。以下是了解OpenGL中的MODELVIEW和PROJECTION矩阵的一个很好的资源:OpenGL Transformation。 E.g:
再次注意,OpenGL执行 反向的多次转换 因此,顺序,查看转换 在建模变换之前首先出现 在你的代码中。而且,如果你愿意的话 旋转然后翻译一个对象,放 首先是glTranslatef()然后是glRotatef()。
答案 2 :(得分:0)
验证矩阵是否构造正确(将其打印到文件或类似),然后记住,根据您使用post还是pre multiply,结果完全不同。如果您仍有问题,请向我们展示一些代码。