首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

继续OpenGL的一些有关问题的探讨

2012-11-05 
继续OpenGL的一些问题的探讨glPushMatrix()glPopMatrix()探讨此两个函数使用的局限性我们很容易理解 上

继续OpenGL的一些问题的探讨
glPushMatrix();  
glPopMatrix();
探讨此两个函数使用的局限性
   
我们很容易理解 上面的函数组合使用可以保持物体旋转而原坐标系不变
就是说当你实现了物体的旋转以后,原坐标系归位

举一个成功应用的例子:
glRotatef( xRot1, 1.0, 0.0, 0.0 ) = M11; 目的是实现物体1按xRot1量旋转
glRotatef( xRot2, 1.0, 0.0, 0.0 ) = M22; 目的是实现物体2按xRot2量旋转

我们绘制2个物体,这两个物体的初始矩阵都为M;

将2者都放在paiterGL函数里
结果为M1=M11*M (没问题)
  M2=M22*M11*M (有问题了,继承了M11,使得物体2为xRot1和xRot2的叠加)

此时将
glPushMatrix();  
glPopMatrix();应用于物体1的绘制
将屏蔽掉M11,使其在M2的绘制中不起作用了

对于以上问题这种方法很有效!!告一段落

接着往下看……

这两天研究OpenGL,上网查了很多资料,也想了很多,基本的思路算是清楚了

我发现网上不少人问OpenGL物体旋转引起的坐标轴的混乱,我看到好多人不由分说就引入
glPushMatrix();  
glPopMatrix();
的使用

那么现在的问题是:
对于同一个物体使用
glRotatef( 45, 1.0, 0.0, 0.0 );=M11
glRotatef( 45, 0.0, 1.0, 0.0 );=M22
绕2个轴的依次旋转(其实我想实现的是物体分别按照原世界坐标系x y来分别进行旋转)

好吧 那么M1=M22*M11*M

看起来好像很正确

其实不然,以上公式是分部进行的,也就是说首先M1=M11*M
这时候,图形引起的变化是除了X轴上的点不动以外
其他点均朝向屏幕外翻45度,好吧,具体点就是如果是一个球,这个球朝向你滚动了45度(应该能理解吧)
这之后,令人不爽的是Y轴由指向上,变为了指向你,这时候M22无论如何是乘在了M11*M的基础上的
所以,球绕Y轴的转动变成了向右滚动45度角

而我本意想实现的是球在朝向你滚动了45度之后,能够原地打转45度(这时候Y轴还向上呢)
这时候要求M1=M22*M(M11是被屏蔽掉了)
但是绘制同一个物体
glPushMatrix();  
glPopMatrix();
无法通过这两个函数实现绕x旋转后坐标归位,然后再实现绕y轴的旋转

那么有什么其他的好方法么?

好不容易想明白了,但是目前苦于找不到解决方案
问问题的同时,希望我这个帖子讲的还算清楚,让那些仍苦于思索这个问题的兄弟们能明白一点


 

[解决办法]
你可以用Qt3D 呢。就不用纯手写了。。一般是模型建立好了。。我们在程序里移动物体就好了。
有空你看看Qt3D的源码嘛。很好很强大。当然这个要有一定的Opengl编程基础。
我觉得你行的~~有收获.记得写博客哈。。。

热点排行