查看: 1866|回复: 4

请教循环求交点的问题!

[复制链接]

该用户从未签到

发表于 2009-4-23 10:59:03 | 显示全部楼层 |阅读模式
osg:ineSegment* lineSegment=new osg::LineSegment();
        osgUtil::IntersectVisitor intersectVisitor;
        osgUtil::IntersectVisitor::HitList hitList;
        osgUtil::Hit hit;                                       
                                        lineSegment->set(osg::Vec3(_beginX,_beginY,99),osg::Vec3(_beginX,_beginY,-99));       
                intersectVisitor.addLineSegment(lineSegment);
                _theProjection->accept(intersectVisitor);               
                hitList=intersectVisitor.getHitList(lineSegment);
                k1=hitList.size();
                std::cout<<k1<<std::endl;

                lineSegment->set(osg::Vec3(_beginX,_beginY+6.0,99),osg::Vec3(_beginX,_beginY+6.0,-99));       
                intersectVisitor.addLineSegment(lineSegment);
                _theProjection->accept(intersectVisitor);               
                hitList=intersectVisitor.getHitList(lineSegment);
                k2=hitList.size();
                                          std::cout<<k2<<std::endl;
请教各位意下为什么k1和k2的值会一样呢?(过x,y坐标为_beginX,_beginY的线在平面_theProjection内,而过x,y坐标为_beginX,_beginY+6.0的线不在平面内,按理说k1应该为1,k2应该为0呀,为什么两个都为1),谢谢

该用户从未签到

发表于 2009-4-23 11:07:56 | 显示全部楼层
建议您换用LineSegmentIntersector以及IntersectionVisitor试一下,IntersectVisitor只是为了保持与早期版本的兼容性而存在,我不确定它是否会有一些代码没有更新

该用户从未签到

 楼主| 发表于 2009-4-23 11:11:01 | 显示全部楼层
问题解决了,一个osg:ineSegment* lineSegment=new osg:ineSegment();
        osgUtil::IntersectVisitor intersectVisitor;
        osgUtil::IntersectVisitor::HitList hitList;
        osgUtil::Hit hit;  
       只能添加一个ineSegment,多了就只默认第一个了,呵呵,谢谢array

该用户从未签到

 楼主| 发表于 2009-4-23 20:52:32 | 显示全部楼层
呵呵,我用LineSegmentIntersector实现了,并且修正了前面的错误,参看的是osgPick,代码是
  1.                         osgUtil::LineSegmentIntersector::Intersections _intersections;
  2. osg::ref_ptr< osgUtil::LineSegmentIntersector > _lineSegmentIntersector = new osgUtil::LineSegmentIntersector(osg::Vec3(_beginX,_beginY,999),osg::Vec3(_beginX,_beginY,-999));
  3.                         osgUtil::IntersectionVisitor _iv(_lineSegmentIntersector.get());
  4.                         _theProjection->accept(_iv);
  5.                         _intersections=_lineSegmentIntersector->getIntersections();
  6.                         _intersectionNumber=_intersections.size();       
  7.   if (_intersectionNumber!=0)
  8.                   {         
  9.                           osgUtil::LineSegmentIntersector::Intersections::iterator hitr = _intersections.begin();
  10.                           intersectPointVec3=hitr->getWorldIntersectPoint();               
  11.                        
  12.                   }
复制代码
虽然实现了,但是还是不懂各个步骤的意思,能否简单说明一下,谢谢

[ 本帖最后由 array 于 2009-4-23 21:52 编辑 ]

该用户从未签到

发表于 2009-4-23 22:01:07 | 显示全部楼层
LineSegmentIntersector指定所用的相交测试对象,可选的包括线段,平面,多面体等;
IntersectionVisitor负责记录这一对象,并通过node->accept遍历节点树,取出和此对象存在交点的各个节点,保存的结果列表可以通过getIntersections()取出并进行访问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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