查看: 3062|回复: 5

求教:osg框选实现

[复制链接]

该用户从未签到

发表于 2011-11-22 09:19:13 | 显示全部楼层 |阅读模式
本帖最后由 zhangjijiang121 于 2011-11-22 09:31 编辑

在论坛和群里请教了几位高手,他们告诉我用osgUtil:: PolytopeIntersector。我也参照了osg源代码中的Example osgkeyboardmouse 中关于PolytopeIntersector的使用。我是这样实现的。鼠标滑动得到一个起始点sPos和终止点ePos,代码如下
  1. void TestPolytopeIntersector:: GetNodePathByPolytope(osg::Vec2 sPos, osg::Vec2 ePos)
  2. {

  3.         double mx = std::min(sPos[0],ePos[0]);
  4.         double my = std::min(sPos[1],ePos[1]);
  5.         double mxx = std::max(sPos[0],ePos[0]);
  6.         double myy = std::max(sPos[1],ePos[1]);
  7. picker = new osgUtil:: PolytopeIntersector( osgUtil::Intersector:: PROJECTION, mx, my, mxx, myy );

  8.        
  9.         osgUtil::IntersectionVisitor iv(picker);

  10.         GetCamera()->GetOSGCamera()->accept(iv);
  11.   
  12.         if (picker->containsIntersections())
  13.         {
  14.                 osgUtil:: PolytopeIntersector:: Intersection intersection = picker->getFirstIntersection();
  15.        
  16.                 nodePath = intersection.nodePath;
  17.         }
  18.          cout<<"---------------------------"<<endl;
  19.     osg::Node* node;
  20.         osg::NodePath::iterator nIter=nodePath.begin();
  21.         osg::NodePath::iterator nEndIter=nodePath.end();
  22.         for (int i=0;nIter!=nEndIter;++i,++nIter)
  23.         {
  24.                 node=(*nIter);
  25.                 cout<<"className="<<node->className();
  26.                 cout<<"   nameMask="<<node->getNodeMask();
  27.                 cout<<"   name="<<node->getName()<<endl;
  28.         }

  29. }
复制代码
问题:后来我发现这样框选,选中的好像只是鼠标划过屏幕的斜线切到的场景节点对象,并不是框内的对象。难道我用错了方法吗?
picker = new osgUtil:: PolytopeIntersector( osgUtil::Intersector::  PROJECTION, mx, my, mxx, myy );这一句是否是框选实现方法呢?请大家指点。

该用户从未签到

发表于 2011-11-22 12:11:56 | 显示全部楼层
请确定你的坐标是否在projection空间

该用户从未签到

 楼主| 发表于 2011-11-22 13:26:58 | 显示全部楼层
fenma3422 发表于 2011-11-22 12:11
请确定你的坐标是否在projection空间

这个我可以确定,使用的窗口坐标-1~1的,原点在屏幕中心,我跟踪过osg的example中projection就是这样的坐标。是不是我是失败原因在
  1. osgUtil:: PolytopeIntersector:: Intersection intersection = picker->getFirstIntersection();
复制代码
我不确定是 picker->getFirstIntersection() 还是 picker->getIntersections(); 如果是后者的话 得到的intersection中有6000多个nodePath。这也太多了。无语了。

该用户从未签到

发表于 2011-11-22 17:23:16 | 显示全部楼层
如果是框选,肯定是picker->getIntersections(); ,6000多个只是一个drawable产生的6000个交点,你可以查看相关贴“框选效率”,上面写了优化思路

该用户从未签到

发表于 2011-11-22 19:02:56 | 显示全部楼层
本帖最后由 garyliyong 于 2011-11-22 19:17 编辑

03.

04.        double mx = std::min(sPos[0],ePos[0]);

05.        double my = std::min(sPos[1],ePos[1]);

06.        double mxx = std::max(sPos[0],ePos[0]);

07.        double myy = std::max(sPos[1],ePos[1]);

08.picker = new osgUtil:: PolytopeIntersector( osgUtil::Intersector:: PROJECTION, mx, my, mxx, myy );


mx, my, mxx, myy 这里的值应该是你拉出的矩形框的左下角坐标值和右上角坐标值,你看一下spos,epos的值,如果不行,那你改成window下试试

该用户从未签到

发表于 2014-4-22 16:35:51 | 显示全部楼层
好贴,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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