继续OpenGL的一些问题的探讨

blunder 2012-10-10 04:27:23
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轴的旋转

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

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


...全文
120 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你可以用Qt3D 呢。就不用纯手写了。。一般是模型建立好了。。我们在程序里移动物体就好了。
有空你看看Qt3D的源码嘛。很好很强大。当然这个要有一定的Opengl编程基础。
我觉得你行的~~有收获.记得写博客哈。。。

blunder 2012-10-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
貌似这是纯opengl的问题。。。。qt关系不大呢。
[/Quote]
我又对这个问题进行了深入的了解
我发现想实现这个功能貌似不太容易(如果Qt确实没有类似的功能函数的话)

我还想到了glRotatef( Rot, x, y, z )设置x,y,z为变量的方法,发现这也不是解决问题的方法
Qt确实有在旋转后保持坐标系不变的函数,但是当对同一个物体进行绕X Y Z分别进行旋转时失效了
因为我发现网上有人这样写,如下,但是这样写的方式我试验了并不能解决问题(希望是我写的方式没错)
glPushMatrix();
glRotatef( 45, 1.0, 0.0, 0.0 );
glPushMatrix();
glRotatef( 45, 0.0, 1.0, 0.0 );

draw something;

glPopMatrix();
glPopMatrix();

所以问题有点复杂了(至少目前我这样认为)
所以我仍在研究
  • 打赏
  • 举报
回复
貌似这是纯opengl的问题。。。。qt关系不大呢。
blunder 2012-10-11
  • 打赏
  • 举报
回复
写这么多 回答的这么少 伤心~
  • 打赏
  • 举报
回复
额。。。。这个时候就要用到数学公式了。。自己计算要移动的位子 x y z 的坐标。sina() cos()很快的。

16,175

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧