geometry中写入点云 primitiveset和polyintersection发现的一些需要注意的问题

发现基元primitive和基元集primitiveset使用的一些小tips或者tricks,记录一下 

 工作概述:有N个三维点,知道三维点的位置坐标信息和颜色值,以如下方式存储这些点。这里为了简单说明,假设我们存入了12个在同一平行于屏幕的平面上的点。然后用polyintersection进行框选,希望对框选到的点做进一步处理

osg::ref_ptr geom = new osg::Geometry();geom->setVertexArray(v.get()); //v是存储位置的
osg::ref_ptr
geom->setColorArray(clr.get());  //clr是存储颜色的osg::ref_ptr
geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX); 
geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
//以点形式绘制 设置关联方式
geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0,v.size())); 

当用polyIntersector的时候,想将框选的点删除掉,发现该Intersection方法返回的指针包含了Primitiveset的信息,

osgUtil::PolytopeIntersector* picker;
picker = new osgUtil::PolytopeIntersector(osgUtil::Intersector::WINDOW, minX, minY, maxX, maxY);

picker里面有个参数叫_intersections, 里面记录了每个交点的信息,其中有个叫primitiveIndex,注意此处是基元的索引,而不是基元集的索引

现在要说下发现的问题,以以下两种不同方式压入顶点数据,顶点数据一致。发现框选后返回的结果大有不同,目前看了源码也还没搞明白什么情况,先mark在这里记录。
1)一次压入所有点到一个primitiveset里,如上面提到压入数据的所示。这个情况就比如我们一次读进来所有需要处理的点云

geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, v->size()));

检测下,用这个方法得到基元集列表:osg::Geometry::PrimitiveSetList plist = geom->getPrimitiveSetList();
发现是有两个基元集的,plist的size为1.

采用如下方法框选,选中所有的12个点

picker = new osgUtil::PolytopeIntersector( osgUtil::Intersector::PROJECTION, mx-w, my-h, mx+w, my+h );
osgUtil::IntersectionVisitor iv(picker);
viewer->getCamera()->accept(iv);
osgUtil::PolytopeIntersector::Intersections intersections = picker->getIntersections();

可以发现在picker的_intersections里,一共有12个intersections,而且按照压入的顺序primitiveIndex排列,每一个交点的坐标,与我们压入v的坐标值一一顺序对应。


2)将顶点数据分两次压入:

geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, 4));
geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 4, v->size()));

采用同样方法框选选中所有的12个点,却发现在picker的_intersections里,一共有14个intersections,首先的primitiveIndex是14,然后是0,1,2,...,11,15。不知道这个序号是14,15的是什么鬼....?14的交点距离和其他都不一样,而且为什么没有13?最诡异的是,如果改变上面压入的分界点,比如将4改成6,结果竟然是15个交点,改成10竟然有18个交点,多出来的都是什么鬼啊?难道对与DrawArrays的本身也有一层交点吗?那如果改不同的分界点序号,交点的数量应该是一致的啊,都是分成 两段数据的啊。查找PolyIntersector方法,发现可以设置关注交点的primitive类型,比如只看点交点,只看面、三角形等等,于是我设了只关注点:

picker->setDimensionMask(osgUtil::PolytopeIntersector::DimZero);
picker->setIntersectionLimit(osgUtil::Intersector::LIMIT_NEAREST); //还加了这个,然而也没用什么卵用

发现没有什么卵用。

此问题记录下,看看是否可以解决,如果不行,那就只能一次性压入所有顶点数据了,如果有新加的数据,可能需要重新刷新压入,或者新建立节点?



你可能感兴趣的:(osg)