查看: 1912|回复: 6

关于线段检测的问题

[复制链接]

该用户从未签到

发表于 2009-6-15 15:27:04 | 显示全部楼层 |阅读模式
我想用鼠标拾取场景中的某一个物体,并计算出与物体的交点,我使用线段检测的方法,但是它是检测场景中的所有物体,不知道有没有什么方法能只检测和某一个物体是否相交?

该用户从未签到

发表于 2009-6-15 16:06:06 | 显示全部楼层
仅仅交由这个物体节点来执行相交访问器IntersectionVisitor即可,例如
objNode->accept( intersectionVisitor );
但是注意此时不能使用WINDOW或者PROJECTION模式的相交测试

该用户从未签到

 楼主| 发表于 2009-6-15 16:34:39 | 显示全部楼层
呵呵  谢谢  我试试

该用户从未签到

 楼主| 发表于 2009-6-16 08:40:32 | 显示全部楼层
不知道理解的对不对   根据鼠标当前的位置计算出一条射线  然后将该条线段添加到相交访问器中   将访问器关联到指定地 节点上  然后执行访问器的hits方法  看看有没有和指定的物体相交

该用户从未签到

发表于 2009-6-16 09:37:20 | 显示全部楼层
请参见osgpick~~~~~~~~~~~~

该用户从未签到

 楼主| 发表于 2009-6-16 11:21:08 | 显示全部楼层


  1. osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
  2. osg::Group* root = dynamic_cast<osg::Group*>(view->getSceneData());
  3. osg::Node* earth = dynamic_cast<osg::Node*>(root->getChild(1));

  4. float local_x, local_y = 0.0;   
  5. const osg::Camera* camera = view->getCameraContainingPosition(ea.getX(), ea.getY(), local_x, local_y);

  6. osgUtil::LineSegmentIntersector::CoordinateFrame cf = camera->getViewport() ? osgUtil::Intersector::WINDOW : osgUtil::Intersector::PROJECTION;

  7. osg::ref_ptr< osgUtil::LineSegmentIntersector > picker = new osgUtil::LineSegmentIntersector(cf, local_x, local_y);
  8. osgUtil::IntersectionVisitor iv(picker.get());
  9. //earth->accept(iv);
  10. const_cast<osg::Camera*>(camera)->accept(iv);
  11. if (picker->containsIntersections())
  12. {
  13.     USES_CONVERSION;
  14.     CString t;
  15.     t.Format(A2W("点中地球!!"));
  16.     AfxMessageBox(t);
  17. }
  18. else
  19. {
  20.     USES_CONVERSION;
  21.     CString t;
  22.     t.Format(A2W("没有点中!!"));
  23.     AfxMessageBox(t);
  24. }


复制代码

我如果使用earth->accept(iv),最后的结果是错误的,好像就没有能选中,如果使用const_cast<osg::Camera*>(camera)->accept(iv),结果就是正确的,不知道是为什么,请大家指教!
上面的是参照view类的computeintersections函数实现的。

[ 本帖最后由 zhufu0208 于 2009-6-16 11:23 编辑 ]

该用户从未签到

发表于 2009-6-16 11:35:53 | 显示全部楼层
要特别注意osgUtil::Intersector::WINDOW和osgUtil::Intersector: PROJECTION这两种求交模式的含义。此时求交器会搜索节点中的Camera节点,并根据此摄像机的观察和投影矩阵计算出屏幕上某个点(ea.getX(), ea.getY())对应的三维空间射线,进而将这条射线用于三维对象的求交。

如果节点树没有包含摄像机节点,例如您的earth,那么无法取得这个屏幕点对应的三维射线。求交自然会失败。

使用earth->accept(iv)的话,必须手动指定三维射线的起止点,并采用MODEL求交模式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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