查看: 642|回复: 2

FRAME事件修改场景后求交

[复制链接]

该用户从未签到

发表于 2016-4-28 10:37:51 | 显示全部楼层 |阅读模式
本帖最后由 hzxfrank2010 于 2016-4-28 10:39 编辑

现在有一个问题想请教一下论坛的大神,在我自己写的一个Handler中,在FRAME事件中我修改了场景中的某个MatrixTransform的矩阵,之后在Handler的键盘事件处理中我修改了FRAME事件中矩阵的值,并对该MatrixTransform下的某个节点进行求交,为什么得到的求交结果不会改变?
(这个处理方式的原因是:用户希望移动场景的时候【鼠标不会移动】,提供橡皮筋效果的绘线)

  1.         bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
  2.         {

  3.                 switch(ea.getEventType())
  4.                 {
  5.                 case (osgGA::GUIEventAdapter::FRAME):
  6.                         {
  7.                                 osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
  8.                                 osg::MatrixTransform*  pTrans=dynamic_cast<osg::MatrixTransform*>(view->getSceneData()->asGroup()->getChild(0));
  9.                                 //修改MatrixTransform
  10.                                 pTrans->postMult(osg::Matrix::translate(_fValue,0,0));
  11.                                 pTrans->postMult(osg::Matrix::translate(0.0,0.0,_rValue));
  12.                                 _fValue=0.0;
  13.                                 return false;
  14.                         }

  15.                 case(osgGA::GUIEventAdapter::KEYDOWN):
  16.                         {
  17.                                 if(ea.getKey()=='s')
  18.                                 {
  19.                                     //修改Frame中MatrixTransform的值
  20.                                         _fValue=10;
  21.                                         if (view)
  22.                                         {
  23.                                             //求交,这里求交打出的结果都是一样的,但是场景在按下键盘的时候确实在移动?
  24.                                                 osg::Vec3d point=pick(view,ea);

  25.                                         }
  26.                                         i++;
  27.                                 }

  28.                                 return false;
  29.                         }
  30.                 default:
  31.                         return false;
  32.                 }
  33.         }
复制代码

该用户从未签到

发表于 2016-4-28 16:50:55 | 显示全部楼层
场景在移动,求交出的交点重合几率几乎没有,代码给的并不完全,无法看出什么问题,优先考虑求交中处理是否有问题

该用户从未签到

 楼主| 发表于 2016-4-28 17:02:30 | 显示全部楼层
本帖最后由 hzxfrank2010 于 2016-4-28 17:16 编辑

先谢谢楼上的回答,研究这个问题有几天了,测试了几种方法还是达不到预期的效果。
具体求交的代码是从osgPick的例子中找的
  1. osg::Vec3d TestHandler::pick(osgViewer::View* view, const osgGA::GUIEventAdapter& ea)
  2. {
  3.         osgUtil::LineSegmentIntersector::Intersections intersections;
  4.         osg::Vec3d worldPoint;
  5.         if (view->computeIntersections(ea,intersections))
  6.         {
  7.                 osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin();
  8.                 worldPoint=hitr->getWorldIntersectPoint();
  9.         }
  10.         return  worldPoint;
  11. }
复制代码


目前我自己认为可能的原因是:在键盘操作中求交的时候场景并没有更新,所以使用的还是上一帧的场景数据,导致求出的结果不变。不知道是不是这个原因?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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