查看: 2483|回复: 4

如何求一条线段和网格的所有交点

[复制链接]

该用户从未签到

发表于 2009-7-25 14:09:21 | 显示全部楼层 |阅读模式
一条线段,给定起始点,如何把这条线段映射到地形表面,求出与地形网格的所有交点。
或者怎么贴着地面画线?
谢谢!
grid.JPG 2.JPG
附:
附件中图片,红黄交界处是线段和地形的交界处

该用户从未签到

发表于 2009-7-25 15:23:12 | 显示全部楼层
可以用LinesegmentIntersector来求,但是线段与地形网格的交点是不能得到贴地面的线的。
您要得到线段与地面的交线路径的话,可以用线段所在的垂直平面与地面求交,也就是PlaneIntersector

该用户从未签到

 楼主| 发表于 2009-7-25 17:07:48 | 显示全部楼层
好的,我试试,谢谢array!

该用户从未签到

 楼主| 发表于 2009-7-27 11:06:23 | 显示全部楼层
本帖最后由 vincent 于 2009-7-27 11:16 编辑

再次请教版主及各位高手。
用平面与地形求交,求出的交点有问题,应该是线段所在的垂直平面求错了。
不知道怎么解决?谢谢各位。
  1. //起点startPt,终点endPt
  2. //垂直地形的平面--,我选取的确定平面的第三点是不是有问题???
  3. osg::Plane plane(startPt, endPt,osg::Vec3(startPt.x(),startPt.y(),
  4.     (startPt.z()+endPt.z())/2.0));
  5. //法线
  6. osg::Vec3f norm(endPt-startPt);
  7. norm.normalize();       
  8. osg::Polytope polytope;
  9. polytope.add( osg::Plane(norm,startPt));
  10. polytope.add( osg::Plane(-norm, endPt));
  11.                                                
  12. osg::ref_ptr<osgUtil::PlaneIntersector>intersector = new osgUtil::PlaneIntersector( plane, polytope );
  13. osgUtil::IntersectionVisitor iv( intersector.get() );
  14. root->accept( iv );
  15. osg::ref_ptr <osg::Vec3Array>  linepoint = new osg::Vec3Array;

  16. if ( intersector->containsIntersections() )
  17. {
  18. osgUtil::PlaneIntersector::Intersections& intersections =
  19. intersector->getIntersections();
  20. osgUtil::PlaneIntersector::Intersections::iterator itr;
  21. for ( itr = intersections.begin(); itr != intersections.end(); ++itr )
  22. {
  23.    for( unsigned int i=0; i<(*itr).polyline.size(); ++i)
  24.     {
  25.         fx1 = (*itr).polyline[i].x();       
  26.         fy1 = (*itr).polyline[i].y()       
  27.         fz1 = (*itr).polyline[i].z();       
  28.         linepoint->push_back(osg::Vec3(fx1,fy1,fz1));
  29.     }
  30. }
  31. osg::Geode* pyramidGeode = new osg::Geode();
  32. osg::Geometry* pyramidGeometry = new osg::Geometry();
  33. pyramidGeometry->setVertexArray(linepoint.get());

  34. osg::Vec4Array* colors = new osg::Vec4Array;
  35. colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f) ); //index 0 red

  36. pyramidGeometry->setColorArray(colors);
  37. pyramidGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);   
  38. pyramidGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP, 0, linepoint->size()));

  39. pyramidGeometry->getOrCreateStateSet()->setMode(GL_LIGHTING, false);
  40. pyramidGeode->addDrawable(pyramidGeometry);
  41. root->addChild(pyramidGeode);
复制代码

该用户从未签到

发表于 2009-7-27 19:54:24 | 显示全部楼层
您可以参看一下osgSim::ElevationSlice::computeIntersections()函数中的做法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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