|
[ 本帖最后由 anheihb03dlj 于 2013-3-23 21:00 编辑 ]
[问题描述]
尝试实现类似cad的拉伸操作:选中图形,鼠标MOVE或者DRAG时,图形跟随移动,[b][color=Red]看到的图形会越变越大[/color][/b]
[问题原因]
在MOVE或DRAG消息中实时计算MVPW矩阵。个人猜测:
鼠标移动节点时,osg可能会修改投影矩阵P,而我们在MOVE或DRAG消息中又实时计算MVPW矩阵,可能造成了递归,导致OSG计算错误。
实时观测投影矩阵的(left, right, bottom, top, zNear, zFar参数时),发现随着鼠标移动,这些值在逐渐减小,即视锥体越变越小
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,欢迎各位大虾多多提出问题~~~ |
|