微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OpenGL旋转,平移,推送/弹出问题

如何解决OpenGL旋转,平移,推送/弹出问题

| 我对openGL还是很陌生,但是我一直在为为什么这行不通而苦苦挣扎(不是一定要解决问题,而只是想了解基本原理) 因此,基本上,这将绘制一个旋转的三角形网格。我想了解的是是否/如何删除“推”和“弹出”操作。当我将它们取出时,会有随机的散射。我已经尝试在完成绘图后反转旋转,切换平移和旋转命令。我想我看到的方式是我应该能够避免下推/弹出操作,而应该每次使用旋转比上次增加几度,但是我显然缺少了一些东西。     

解决方法

        您需要颠倒平移和旋转命令(以相反的顺序):
glTranslatef(xF,yF,0);
glRotatef(angle,0.0f,1.0f);                        

// draw

glRotatef(-angle,1.0f);                        
glTranslatef(-xF,-yF,0);
就像@Nicol在下面指出的那样,使用
glPushMatrix
/
glPopMatrix
可能会更快,因为
glRotatef
需要建立一个包含正弦和余弦的旋转矩阵。 此外,由于浮点舍入误差,旋转加上其反向旋转可能无法完全相同。这意味着,如果您在内部循环中依赖此技术(如上所述),则可能会在整个绘制调用过程中积累一些实质性的浮点错误。     ,        推/弹出矩阵正在保存/恢复先前的矩阵。您不能完全避免这样做,因为您将积累平移和旋转。 请记住:glTranslate不会定位事物。它将构建一个转换矩阵并将其应用于当前矩阵,无论它是什么。因此,如果您先进行平移,然后旋转,然后再平移,则最后的平移将位于旋转的空间中,而不是与旋转相同的空间中。     ,        OpenGL保留了内部的转换矩阵堆栈。调用glPushMatrix()时,它将所有矩阵向下推一,将其复制到列表顶部。然后,您可以将转换,旋转,缩放等方式应用于心中的内容,并在完成后调用glPopMatrix()来删除新调整的转换矩阵,其余3D世界将不会改变所有。 请注意,当我说3D世界的其余部分时,下次您的主循环循环将包括您的对象。如果不先调用glPushMatrix()然后再调用glPopMatrix(),则将永久性地改变世界,它将对您的对象产生(不可预测的)影响。 因此,总结起来,除非您知道自己在做什么并且想对其余3D世界产生影响,否则请始终在转换的开始和结束时调用glPushMatrix()和glPopMatrix()。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?