Hi Robert,
Thank you for your answer. Unfortunately, I cannot share the model ...
However, I can share the code.
Here it is:
// Building a osgUtil::PolytopeIntersector from a CONCAVE planar polygon
/* 1) split the concave polygon in its convex rings */
/* 2) iterate over each convex ring to build a convex osg::Polyope
*/
// Begin loop over convex rings
osg::Polytope currentBuildingPolytope;
for(int j=0;j<ring.getNumPoints()-1;++j)
{
osg::Vec3d A( ring.getX(j), ring.getY(j), ring.getZ(j) );
osg::Vec3d B( ring.getX(j+1), ring.getY(j+1), ring.getZ(j+1) );
osg::Vec3d C( ring.getX(j+1), ring.getY(j+1), ring.getZ(j+1)+delta
); // delta > 0.
osg::Vec3d AB = B-A; AB.normalize();
osg::Vec3d BC = C-B; BC.normalize();
osg::Vec3d n = BC^AB; n.normalize();
osg::Plane p(n,A);
currentBuildingPolytope.add(p);
}
osg::ref_ptr<osgUtil::PolytopeIntersector>
currentPolytopeIntersector = new
osgUtil::PolytopeIntersector(currentBuildingPolytope);
currentPolytopeIntersector->setDimensionMask(osgUtil::PolytopeIntersector::DimTwo);
// End loop over convex rings
/* 3) add the convex osg::Polytope to a vector<
ref_ptr<osgUtil::PolytopeIntersector> > */
_polytopeIntersectors.push_back(currentPolytopeIntersector);
/* 4) Find intersections of the model with the previously build
osgUtil::PolytopeIntersectors */
bool hasIntersections = false;
for(unsigned int i=0;i<_polytopeIntersectors.size();++i)
{
osgUtil::IntersectionVisitor
visitor(_polytopeIntersectors[i].get());
osg::ref_ptr<osgSim::DatabaseCacheReadCallback> _readCallback =
new osgSim::DatabaseCacheReadCallback;
visitor.setReadCallback(_readCallback);
model->accept(visitor); // model contains one triangle per
Drawable
if(_polytopeIntersectors[i]->containsIntersections())
{
hasIntersections = true;
_numIntersections +=
_polytopeIntersectors[i]->getIntersections().size();
// ...
}
// ...
}
If you see anything wrong, please let me know.
As I tols in my first post, the reader callback works quite well (my DB
model contains around 150 files). Debugging my application, the method
IntersectionVisitor::apply(osg::PagedLOD& plod) exits on the first line
only if _intersectorStack.back()->enter(node); returns false. This happen
in LineSegmentIntersector::intersects(const osg::BoundingSphere& bs),
because of this line:
if (d<0.0) return false;
which seems to mean that the bounding sphere of the current PagedLOD is not
intersected by the line.
Hope this give you more :)
Regards,
Olivier
2013/11/21 Robert Osfield <[email protected]>
> Hi Oliver,
>
> I have looked at the OSG code and can't see a specific cause, but then I
> don't have your code or models so it's all just guessing.
>
> Does LineOfSight work fine for you? If so I'd recommend stepping through
> to see what happening and then compare it with your own usage.
>
> Robert.
>
>
> On 19 November 2013 19:58, Olivier Tournaire <[email protected]> wrote:
>
>> Hi all,
>>
>> Sorry for the noise, but, as I did not receive any answer, I am
>> interested if someone has an idea on the topic.
>>
>> Regards,
>>
>> Olivier
>>
>>
>> 2013/11/15 Olivier Tournaire <[email protected]>
>>
>>> Hi,
>>>
>>> I am currently trying to retrieve some specific triangles in a PagedLOD
>>> model. To do so, I use a PolytopeIntersector with an IntersectionVisitor.
>>> As my model is a PagedLOD, I have set up a reader callback, directly taken
>>> from osgSim::LineOfSight.
>>>
>>> The intersector works, but not as expected: it gives me the triangles at
>>> the lowest resolution, whereas I would expect to have them at the finest
>>> LOD. Debugging my program showed me that the void
>>> IntersectionVisitor::apply(osg::PagedLOD& plod) method goes where it has to
>>> (i.e., it traverses correctly all childs until the best resolution).
>>>
>>> As the IntersectionVisitor sets up by default to use
>>> the USE_HIGHEST_LEVEL_OF_DETAIL flag, I am wondering if I am missing
>>> something and if you could give some pointers on how to achieve triangles
>>> extraction at the finest LOD.
>>>
>>> The "header" root file is:
>>>
>>> osg::PagedLOD {
>>> UniqueID 1
>>> Name "Tile_+001_+006.osgb"
>>> CenterMode USER_DEFINED_CENTER
>>> UserCenter -741.555 904.039 94.1168 213.403
>>> RangeMode PIXEL_SIZE_ON_SCREEN
>>> RangeList 2 {
>>> 0 106.702
>>> 106.702 1e+030
>>> }
>>> DatabasePath FALSE
>>> RangeDataList 2 {
>>> ""
>>> "Tile_+001_+006_L15_0.osgb"
>>> }
>>> PriorityList 2 {
>>> 0 1
>>> 0 1
>>> }
>>>
>>> The "header" of the child file (Tile_+001_+006_L15_0.osgb) is:
>>>
>>> osg::PagedLOD {
>>> UniqueID 1
>>> Name "Tile_+001_+006_L15_0.osgb"
>>> CenterMode USER_DEFINED_CENTER
>>> UserCenter -741.869 906.466 94.7166 206.312
>>> RangeMode PIXEL_SIZE_ON_SCREEN
>>> RangeList 2 {
>>> 0 206.312
>>> 206.312 1e+030
>>> }
>>> DatabasePath FALSE
>>> RangeDataList 2 {
>>> ""
>>> "Tile_+001_+006_L16_00.osgb"
>>> }
>>> PriorityList 2 {
>>> 0 1
>>> 0 1
>>> }
>>>
>>>
>>> Hope you could help
>>>
>>> Regards,
>>>
>>> Olivier
>>>
>>
>>
>> _______________________________________________
>> osg-users mailing list
>> [email protected]
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>
>>
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org