查看: 2975|回复: 19

关于鼠标移动响应

[复制链接]

该用户从未签到

发表于 2013-1-31 12:36:15 | 显示全部楼层 |阅读模式
我想添加鼠标移动响应 当我鼠标移动的时候 视点跟着移动 类似第一人称射击游戏那种  我的操作器是继承的FirstPersonManipulator  表示视点姿态用的是 osg::Vec3d _eye;    osg:uat  _rotation;  看了看OSG程序设计教程 里边的例子有拖动的实现  但是用的是Vec3 类型的变量表示旋转 跟我的不太一样 我是新手不太了解之间的关系  请指教

该用户从未签到

发表于 2013-1-31 12:59:34 | 显示全部楼层
能否进一步详述您的问题

该用户从未签到

 楼主| 发表于 2013-1-31 13:24:19 | 显示全部楼层
array 发表于 2013-1-31 12:59
能否进一步详述您的问题

就是实现move响应 鼠标移动 让视点也跟着移动  然后让鼠标始终保持在屏幕中心 但是找不到适当的例子 不知道怎么实现。。

                        int moveX = ea.getX();
                        int moveY = ea.getY();
                        float txy = 0.6*(-moveX+_mwidth)/_mwidth;
                        xy-=txy;
                        osg:uat qw(txy,osg::Vec3d(0,0,1));
                        _rotation*=qw;
                        osg::Quat at;
                        at.makeRotate(xy,Vec3(0,0,1));
                        _rotation*=at;
                        txy = 0.4*(+moveY-_mheight)/_mheight;
                        at.makeRotate(txy,osg::Vec3d(1,0,0));
                        _rotation*=at;
                        at.makeRotate(-xy,Vec3(0,0,1));
                        _rotation*=at;
                        aa.requestWarpPointer(_mwidth,_mheight);        //光标重置到屏幕中心

这个是我现在的move里的代码  鼠标左右动没有问题 但是上下动 就不太对了 其中_mwidth _mheight是屏幕宽高的一半

该用户从未签到

发表于 2013-2-2 11:06:42 | 显示全部楼层
本帖最后由 1162810317 于 2013-2-2 11:12 编辑

就像cs那样,(应该都玩过吧)光标总是在中间,并且由光标控制视口!
我也在弄这个,不懂,有结果了别忘了公布答案哦,学习学习!谢谢!

该用户从未签到

 楼主| 发表于 2013-2-2 13:54:41 | 显示全部楼层
1162810317 发表于 2013-2-2 11:06
就像cs那样,(应该都玩过吧)光标总是在中间,并且由光标控制视口!
我也在弄这个,不懂,有结果了别忘了 ...

就是你说的这样! 我目前有个想法是 获得当前视口的朝向 找到垂直于这个朝向并且垂直于Z轴的 那个向量 作为旋转轴 做四元数旋转  但是不知道如何获得当前视口的朝向。。正在研究。。有知道的告诉下 谢谢!

该用户从未签到

发表于 2013-2-4 09:37:52 | 显示全部楼层
当前视口的朝向?难道不是view matrix中的view vector么

该用户从未签到

 楼主| 发表于 2013-2-4 18:16:37 | 显示全部楼层
array 发表于 2013-2-4 09:37
当前视口的朝向?难道不是view matrix中的view vector么

啊?  能具体一些么?  这个vector 是viewer的成员? 我程序里怎么找不到? 代码应该怎么写获得这个vector?

该用户从未签到

发表于 2013-2-5 11:23:18 | 显示全部楼层
一大波蓝猫 发表于 2013-2-2 13:54
就是你说的这样! 我目前有个想法是 获得当前视口的朝向 找到垂直于这个朝向并且垂直于Z轴的 那个向量 作 ...

我的想法比较简单,就是想通过判断前后两次鼠标的位置的变化,根据这个变化量旋转视口,这边用不到平移,只要旋转,问题是可能无法确保光标在中间,但我想经过调试,应该会有一个合适的值,确保光标在中间,毕竟这样可能会更简单点,我现在不明白的是move函数中鼠标值是移动前的还是移动后的???

该用户从未签到

 楼主| 发表于 2013-2-16 16:04:53 | 显示全部楼层
1162810317 发表于 2013-2-5 11:23
我的想法比较简单,就是想通过判断前后两次鼠标的位置的变化,根据这个变化量旋转视口,这边用不到平移, ...

旋转得找到旋转轴。。先用ea.getX()或者移动前的坐标 保存到变量里

该用户从未签到

发表于 2013-2-24 16:19:16 | 显示全部楼层
本帖最后由 1162810317 于 2013-2-24 19:34 编辑
一大波蓝猫 发表于 2013-2-16 16:04
旋转得找到旋转轴。。先用ea.getX()或者移动前的坐标 保存到变量里


想问下弄的怎样了??研究出来没???
我是想这样,代码:
  case (osgGA::GUIEventAdapter ::MOVE  ):
  //  if ( m_bLeftButtonDown)
    {
      m_vRotation._v[2] += osg:egreesToRadians(M_fAngle *
(m_fpushX-mouseX)*0.3);
      m_vRotation._v[0] -= osg::DegreesToRadians(1.1*(m_fpushY-mouseY)*0.3) ;
      //控制向下看时不至于不符合实际一直转圈看到后面   
      if (m_vRotation._v [0] >= 3.14)   
        m_vRotation._v [0] = 3.14 ;
      if (m_vRotation._v [0] <= 0)
        m_vRotation._v [0] = 0 ;
           m_fpushX = mouseX ;   
           m_fpushY = mouseY ;
    }  
    return false ; 功能基本实现,(其中的0.3是我测试很多次得到的感觉较好的值,0.5还是偏大点)
但就是不能让光标保持中间
怎样才能使光标一直在中间啊???还有怎样才能让视口中出现一个十字架???

该用户从未签到

发表于 2013-2-25 09:21:07 | 显示全部楼层
您的问题和整个帖子似乎并无关系,建议您重新开贴。
此外要让视口中出现十字架,最简单的方法就是用一个HUDCamera

该用户从未签到

发表于 2013-2-25 21:23:33 | 显示全部楼层
array 发表于 2013-2-25 09:21
您的问题和整个帖子似乎并无关系,建议您重新开贴。
此外要让视口中出现十字架,最简单的方法就是用一个HU ...

谢谢,我重新开贴~

该用户从未签到

 楼主| 发表于 2013-2-26 08:58:23 | 显示全部楼层
1162810317 发表于 2013-2-24 16:19
想问下弄的怎样了??研究出来没???
我是想这样,代码:
  case (osgGA::GUIEventAdapter ::MO ...

有一个函数可以让鼠标保持在屏幕中央
aa.requestWarpPointer(x,y);

该用户从未签到

发表于 2013-2-26 17:07:01 | 显示全部楼层
本帖最后由 1162810317 于 2013-2-26 17:16 编辑
一大波蓝猫 发表于 2013-2-26 08:58
有一个函数可以让鼠标保持在屏幕中央
aa.requestWarpPointer(x,y);


貌似没用哦,加了后鼠标连窗口都进不去,一进去就被移出来。。。x和y是0.5

该用户从未签到

 楼主| 发表于 2013-2-27 09:40:41 | 显示全部楼层
1162810317 发表于 2013-2-26 17:07
貌似没用哦,加了后鼠标连窗口都进不去,一进去就被移出来。。。x和y是0.5

这里的x y 是你要使鼠标停留的位置坐标 是屏幕坐标系 你0.5的话肯定是一直保持在左上角吧  你获得窗口宽和高 各除以2 作为参数试下

该用户从未签到

发表于 2013-2-28 10:03:04 | 显示全部楼层
本帖最后由 1162810317 于 2013-2-28 10:06 编辑
一大波蓝猫 发表于 2013-2-27 09:40
这里的x y 是你要使鼠标停留的位置坐标 是屏幕坐标系 你0.5的话肯定是一直保持在左上角吧  你获得窗口宽和 ...


不是左上角,我用的是mfc的框架,没有最大化,然后鼠标在窗口外面哪里都行,但就是进不去????x,y都是0.5的话应该是中间??、左上角是(0.0)右下角是(1.1)中间(0.5,0.5)!

我还想问下,你那个效果做出来没???
我感觉不是鼠标的问题,因为只要有移动,鼠标就不可能在中间,也就是说中间的十字架不是光标,不能单用鼠标位置来判断。
很想知道你做出来那种效果没???

该用户从未签到

 楼主| 发表于 2013-2-28 11:58:26 | 显示全部楼层
“左上角是(0.0)右下角是(1.1)” 是为什么呢。。
移动基本算是做出来了  不过鼠标还是有晃动 可能是机器反应问题

该用户从未签到

发表于 2013-2-28 18:20:23 | 显示全部楼层
一大波蓝猫 发表于 2013-2-28 11:58
“左上角是(0.0)右下角是(1.1)” 是为什么呢。。
移动基本算是做出来了  不过鼠标还是有晃动 可能是机 ...

书上说的啊,左上角是(0,0),,,,,,你的那个做到你说的那种效果了吗?就是中间的十字架保持中间不动,,,,??????

该用户从未签到

 楼主| 发表于 2013-2-28 19:24:20 | 显示全部楼层
1162810317 发表于 2013-2-28 18:20
书上说的啊,左上角是(0,0),,,,,,你的那个做到你说的那种效果了吗?就是中间的十字架保持中间不动 ...

左上是0 0 但是右下为什么是1 1呢。。不是应该是窗口分辨率么   我没用十字架 就是鼠标指针  基本算是能保持在中间 就是会有小距离的晃动

该用户从未签到

发表于 2013-3-1 14:41:52 | 显示全部楼层
一大波蓝猫 发表于 2013-2-28 19:24
左上是0 0 但是右下为什么是1 1呢。。不是应该是窗口分辨率么   我没用十字架 就是鼠标指针  基本算是能保 ...

我有点困惑,假如你的鼠标从中间移开到a,然后视口跟着移动,那么当你的鼠标从a被移回到中间时视口会移动吗???
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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