查看: 1470|回复: 4

在MOVE或DRAG消息处理中绝对不能实时计算MVWP矩阵

[复制链接]

该用户从未签到

发表于 2013-3-23 20:58:13 | 显示全部楼层 |阅读模式
[ 本帖最后由 anheihb03dlj 于 2013-3-23 21:00 编辑 ]

[问题描述]
尝试实现类似cad的拉伸操作:选中图形,鼠标MOVE或者DRAG时,图形跟随移动,[b][color=Red]看到的图形会越变越大[/color][/b]
鼠标拖动前.PNG

鼠标拖动.PNG

[问题原因]
在MOVE或DRAG消息中实时计算MVPW矩阵。个人猜测:
鼠标移动节点时,osg可能会修改投影矩阵P,而我们在MOVE或DRAG消息中又实时计算MVPW矩阵,可能造成了递归,导致OSG计算错误。
实时观测投影矩阵的(left, right, bottom, top, zNear, zFar参数时),发现随着鼠标移动,这些值在逐渐减小,即视锥体越变越小
投影矩阵变化1.PNG

投影矩阵变化2.PNG

a、在MOVE或者DRAG消息中计算MVPW矩阵
osg::Matrix computeMVPW( osg::Camera* camera )
{
   osg::Matrix matrix;
   if ( camera->getViewport() )
   {
        matrix.set( camera->getViewMatrix() * camera->getProjectionMatrix() );
        matrix.postMult( camera->getViewport()->computeWindowMatrix() );
   }
   return matrix;
}

b、在MOVE或者DRAG消息间接计算MVPW矩阵
==>下面的是利用projector计算投影点的代码
osgManipulator::PointerInfo pi;
pi.reset();
[b][color=Red]// 设置相机(该函数计算了MVPW矩阵)[/color][/b]
pi.setCamera( camera );
// 设置鼠标坐标
pi.setMousePosition( ea.getX(), ea.getY() );
// 平面投影
osgManipulator::PlaneProjector* planeProj = new osgManipulator::PlaneProjector;
osg::Plane plane( osg::Vec3(0,0,1), osg::Vec3(0,0,0) );
planeProj->setPlane( plane );
// 计算投影点
osg::Vec3d v;
planeProj->project( pi, v );

[解决方法]
很简单,在DRAG或者MOVE消息之前计算好MVWP!!!!

[吐槽]
开始的时候尝试了很久都没解决问题,后来研究Dragger类的源代码,发现在Dragger.cpp第342行
             //  ...
             case osgGA::GUIEventAdapter::PUSH:
                // ...
342行      _pointer.setCamera(rootCamera);

有这么一个调用,setCamera函数的实现里计算了MVPW矩阵,当时都有点想吐血了.........

ps:本人初学OSG,欢迎各位大虾多多提出问题~~~

该用户从未签到

发表于 2013-3-25 08:15:10 | 显示全部楼层
什么问题???

该用户从未签到

发表于 2013-3-25 09:44:52 | 显示全部楼层
不,我想您也许是分析过度了。。
选中图形,鼠标MOVE或者DRAG时,图形跟随移动,看到的图形会越变越大
在我看来这是因为您的拖动操作中对于被拖动的物体也做了求交的操作,每次都是求得球面上点然后把球心移动到这点上。。所以这个对象当然是越求交变大了

该用户从未签到

 楼主| 发表于 2013-3-25 18:16:35 | 显示全部楼层
array 发表于 2013-3-25 09:44
不,我想您也许是分析过度了。。在我看来这是因为您的拖动操作中对于被拖动的物体也做了求交的操作,每次都 ...

谢谢array,仔细想想果然是这个问题~~~

如果想实现这种实时的拖动,不使用osg的Dragger,那有没有办法解决这个问题啊?比如说临时屏蔽要实时拖动的节点?

该用户从未签到

发表于 2013-3-26 15:20:46 | 显示全部楼层
用NodeMask和TraversalMask与操作的特点就可以避免对物体本身求交了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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