查看: 1554|回复: 6

OSG+QT 漫游器 MOVE响应 问题

[复制链接]

该用户从未签到

发表于 2013-3-21 13:16:15 | 显示全部楼层 |阅读模式
我在只有OSG的工程里  视线了一个第一人称漫游 在move响应里移动鼠标 让视点跟着移动 鼠标始终保持在屏幕中心 没有任何问题
现在我有一个OSG+QT的工程 在osgwidget里添加了漫游器  move响应的代码一样的 为什么运行后效果有问题呢? 鼠标上下移动的时候 视点不跟着动 比较诡异。代码如下

case osgGA::GUIEventAdapter::MOVE:
                {
                        //sleep(1.0);
                        int moveX = ea.getX();
                        int moveY = ea.getY();

                        //横向移动视点
                        float txy;
                        txy = 0.4 * (-moveX+_mwidth)/_mwidth;
                        xy -= txy;
                        osg:uat qw(txy, osg::Vec3d(0,0,1));
                        _rotation *= qw;
                       
                        osg::Quat curQuat = getMatrix().getRotate();        //获得当前姿态
                        float heading, pitch, roll;
                        QuatToHPRR(curQuat, heading, pitch, roll);//四元数转换成欧拉角
                        heading = -heading;
                        if(xy >= osg:I){        //把xy控制在-PI到PI之间 可有可无 测试用
                                xy -= 2*osg::PI;
                        }else if(xy <= -osg::PI){
                                xy += 2*osg::PI;
                        }

                        osg::Vec3 e, c, u, front;
                        viewer->getCamera()->getViewMatrixAsLookAt(e, c, u);
                        front = c-e;
                        if(front.x()>0.0 && front.y()<0.0){       
                                heading += osg::PI;
                        }else if(front.x()<0.0 && front.y()<0.0){
                                heading -= osg::PI;
                        }
                        //鼠标上下移动的处理
                        osg::Quat at;
                        at.makeRotate(heading,osg::Vec3(0,0,1));
                        _rotation*=at;
                        txy = 0.4*(+moveY-_mheight)/_mheight;
                        at.makeRotate(txy, osg::Vec3d(1,0,0));
                        _rotation*=at;
                        at.makeRotate(-heading,osg::Vec3(0,0,1));
                        _rotation*=at;
                        if(isMid){
                                QCursor::setPos(_mwidth,_mheight);
                        }
                        return true;
                }

请问为什么在QT控件里 效果就不一样了 求指导 谢谢!

该用户从未签到

发表于 2013-3-22 08:37:44 | 显示全部楼层
首先提一个建议,去掉代码中的表情
其次,确保您的move事件在osg中被处理,可以使用断点调试,还要qt窗口默认好像是不跟踪鼠标移动,看看是不是要设置一下

该用户从未签到

发表于 2013-3-22 09:51:39 | 显示全部楼层
楼上正解!

该用户从未签到

发表于 2013-3-22 09:51:53 | 显示全部楼层
果然版主

该用户从未签到

 楼主| 发表于 2013-3-23 15:18:32 | 显示全部楼层
liuzhiyu123 发表于 2013-3-22 08:37
首先提一个建议,去掉代码中的表情
其次,确保您的move事件在osg中被处理,可以使用断点调试,还要qt窗口默 ...

嗯 以后注意代码中的表情  调试过了 能进去 不过您说的设置鼠标跟踪没弄过 我去看看 谢谢回答!

该用户从未签到

 楼主| 发表于 2013-3-23 16:50:15 | 显示全部楼层
liuzhiyu123 发表于 2013-3-22 08:37
首先提一个建议,去掉代码中的表情
其次,确保您的move事件在osg中被处理,可以使用断点调试,还要qt窗口默 ...

您说的跟踪鼠标移动是这个么?this->setMouseTracking(true);
我之前就已经设置为true了
之前不加这个的话确实不能有鼠标响应
不过加了这个 还是有上述问题 请问还有什么原因么?

该用户从未签到

发表于 2013-3-25 08:01:23 | 显示全部楼层
跟踪一下 看看里面的每个参数 跟不使用qt 比较一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表