查看: 5901|回复: 12

PolytopeIntersector ()参数问题

[复制链接]

该用户从未签到

发表于 2011-12-21 11:14:31 | 显示全部楼层 |阅读模式
本帖最后由 kyl5451 于 2011-12-21 11:16 编辑

看osg自带的例子里面没有用的
  1. PolytopeIntersector  ( CoordinateFrame  cf,   const osg::Polytope &  polytope  )
复制代码
这个函数的方法。我看了下函数的定义,函数中的第二个参数 polytope  是需要传递一个多面体吗?这个多面体是类似于
  1. osgUtil::PolytopeIntersector::PolytopeIntersector  ( CoordinateFrame  cf,  
  2.   double  xMin,  
  3.   double  yMin,  
  4.   double  xMax,  
  5.   double  yMax  
  6. )  
复制代码
传递的那种顶点是一个点的锥形多面体吗?
   这个参数需要怎么获得呢,不知道有没有哪位朋友知道这个,指教下啊

该用户从未签到

发表于 2011-12-21 11:33:28 | 显示全部楼层
可以参考一下源码,第二种方式的本质也是生成一个Polytope
  1. PolytopeIntersector::PolytopeIntersector(CoordinateFrame cf, const osg::Polytope& polytope):
  2.     Intersector(cf),
  3.     _parent(0),
  4.     _polytope(polytope),
  5.     _dimensionMask( AllDims )
  6. {
  7.     if (!_polytope.getPlaneList().empty())
  8.     {
  9.         _referencePlane = _polytope.getPlaneList().back();
  10.     }
  11. }

  12. PolytopeIntersector::PolytopeIntersector(CoordinateFrame cf, double xMin, double yMin, double xMax, double yMax):
  13.     Intersector(cf),
  14.     _parent(0),
  15.     _dimensionMask( AllDims )
  16. {
  17.     double zNear = 0.0;
  18.     switch(cf)
  19.     {
  20.         case WINDOW : zNear = 0.0; break;
  21.         case PROJECTION : zNear = 1.0; break;
  22.         case VIEW : zNear = 0.0; break;
  23.         case MODEL : zNear = 0.0; break;
  24.     }

  25.     _polytope.add(osg::Plane(1.0, 0.0, 0.0, -xMin));
  26.     _polytope.add(osg::Plane(-1.0,0.0 ,0.0, xMax));
  27.     _polytope.add(osg::Plane(0.0, 1.0, 0.0,-yMin));
  28.     _polytope.add(osg::Plane(0.0,-1.0,0.0, yMax));
  29.     _polytope.add(osg::Plane(0.0,0.0,1.0, zNear));

  30.     _referencePlane = _polytope.getPlaneList().back();
  31. }
复制代码

该用户从未签到

 楼主| 发表于 2011-12-21 11:45:32 | 显示全部楼层
本帖最后由 kyl5451 于 2011-12-21 11:53 编辑
eslinan 发表于 2011-12-21 11:33
可以参考一下源码,第二种方式的本质也是生成一个Polytope


问题是这个polytope要怎么获得呢?
还有就是:通过这个函数可以实现多边形的选择吗?
  1. osgUtil::PolytopeIntersector::PolytopeIntersector  ( CoordinateFrame  cf,  
  2.   double  xMin,  
  3.   double  yMin,  
  4.   double  xMax,  
  5.   double  yMax  
  6. )
复制代码
是绘制只有四个顶点的多边形,那我现在想绘制多个点的不规则多边形可以实现吗?_polytope的值多余6个。

该用户从未签到

发表于 2011-12-21 12:11:59 | 显示全部楼层
本帖最后由 fenma3422 于 2011-12-21 12:13 编辑
问题是这个polytope要怎么获得呢?问题是这个polytope要怎么获得呢?

自己根据屏幕上的点来生成这个,我看了一下用osgUtil:olytopeIntersector可以实现多边形选择,只要你能构造出polytope对象,这个对象由多个面的半空间交集组成,你根据屏幕上多边形点在远近裁剪面上的投影点构造这些面即可

该用户从未签到

发表于 2011-12-21 12:19:01 | 显示全部楼层
fenma3422 发表于 2011-12-21 12:11
自己根据屏幕上的点来生成这个,我看了一下用osgUtillytopeIntersector可以实现多边形选择,只要你能 ...

可以实现任意多边形的选择,但前提是凸多边形,而且还要注意构造Plane时的法线方向

该用户从未签到

发表于 2011-12-21 14:11:58 | 显示全部楼层

该用户从未签到

 楼主| 发表于 2011-12-22 10:29:59 | 显示全部楼层
fenma3422 发表于 2011-12-21 12:11
自己根据屏幕上的点来生成这个,我看了一下用osgUtillytopeIntersector可以实现多边形选择,只要你能 ...

恩,polytope对象构造那里能说的具体一点吗?

该用户从未签到

 楼主| 发表于 2011-12-22 10:39:54 | 显示全部楼层
我看了下,框选用
  1. polytope.setToBoundingBox(osg::BoundingBox(630, 210, -10, 700, 800, 10));
复制代码
设置的时候polytope.planelist中的数据等效于如下的设置方法:
  1. polytope.add(osg::Vec4(-1,0,0,700));
  2.                                 polytope.add(osg::Vec4(0,1,0,-210));
  3.                                 polytope.add(osg::Vec4(0,-1,0,800));
  4.                                 polytope.add(osg::Vec4(0,0,1,10));
  5.                                 polytope.add(osg::Vec4(0,0,-1,10));
  6.                                        
复制代码
,关于vec4的参数设置我不太明白是怎么设置的,是什么含义;那如果我 现在想要绘制多边形的话,是不是也可以直接通过上面的方法add()进顶点坐标啊

该用户从未签到

发表于 2011-12-22 14:03:32 | 显示全部楼层
本帖最后由 fenma3422 于 2011-12-22 14:07 编辑
是不是也可以直接通过上面的方法add()进顶点坐标啊

框选的源代码内的构造方法:
_polytope.add(osg:lane(1.0, 0.0, 0.0, -xMin));
    _polytope.add(osg:lane(-1.0,0.0 ,0.0, xMax));
    _polytope.add(osg:lane(0.0, 1.0, 0.0,-yMin));
    _polytope.add(osg:lane(0.0,-1.0,0.0, yMax));
    _polytope.add(osg:lane(0.0,0.0,1.0, zNear));

add的不是顶点坐标,而是面,这里的意思是压入在屏幕空间的视截体的6个面,他转到世界坐标系中就是一个视截体,你如果要构造那么就应该找到需要的面然后加入

该用户从未签到

发表于 2011-12-22 14:04:12 | 显示全部楼层
本帖最后由 fenma3422 于 2011-12-22 14:07 编辑
_polytope.add(osg:lane(1.0, 0.0, 0.0, -xMin));
    _polytope.add(osg::Plane(-1.0,0.0 ,0.0, xMax));
    _polytope.add(osg::Plane(0.0, 1.0, 0.0,-yMin));
    _polytope.add(osg::Plane(0.0,-1.0,0.0, yMax));
    _polytope.add(osg::Plane(0.0,0.0,1.0, zNear));


这应该才是框选构造的源代码

该用户从未签到

发表于 2013-8-22 10:18:28 | 显示全部楼层
fenma3422 发表于 2011-12-22 14:03
框选的源代码内的构造方法:
_polytope.add(osg:lane(1.0, 0.0, 0.0, -xMin));
    _polytope.add(osg: ...

请问一下  这个屏幕空间的规则长方体为什么转到世界坐标系就是椎体了呀  还有请问为什么只有5个面  不封闭呀

该用户从未签到

发表于 2014-7-31 10:31:39 | 显示全部楼层
2D屏幕上的一个点,扩展到3D空间就是从近平面到远平面的一条线;同理2D屏幕上的一个矩形,扩展到3D就是一个从近平面到元平面的椎体。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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