[osg-users] Easy way to pick nearest edge?

Robert Osfield robert.osfield at gmail.com
Tue Sep 2 02:29:31 PDT 2008


Hi Simon,

Go have a dig in the LineSegmentIntersector.cpp implementation, it
should be possible to get the index and ratios out.

Robert.

On Tue, Sep 2, 2008 at 10:17 AM, Simon Notheis <notheis at ira.uka.de> wrote:
> Hi Robert,
>
> When i pick e.g. a 3d model of a table my result looks like taht:
>
>  intersection.ratio 0.298972
>  intersection.localIntersectionPoint -37.4626 -162.331 25
>  intersection.localIntersectionNormal -0 0 1
>  intersection.getWorldIntersectionPoint() 2187.54 -1787.33 750
>  intersection.getWorldIntersectionNormal() 0 0 1
>  intersection.primitiveIndex 11
> BUT:
>  intersection.indexList.size() 0
>  intersection.ratioList.size() 0
>
>  intersection.drawable.library/className osg::Geometry
>  geometry->getNumPrimitiveSets() 1
>  geometry->getVertexArray()->getNumPrimitiveSets() 8
>
>
>  Simon
>
> Robert Osfield schrieb:
>> Hi Simon,
>>
>> The LineSegmentIntersector records the indices of the vertices of the
>> primitive that has been hit.  The
>> LineSegmentIntersector::Intersection::indexList and ratioList provide
>> the indices and barycentric coords.
>>
>> Robert.
>>
>> On Tue, Sep 2, 2008 at 8:54 AM, Simon Notheis <notheis-LzjI1I19FwmELgA04lAiVw at public.gmane.org> wrote:
>>> Hi everyone,
>>>
>>> I want to use mouse events to pick an object of the 3D scene. Instead of
>>> working with the intersection point, I want to find the nearest vertex
>>> or edge of the polygon that was hit.
>>> Until now I used code similar to the following one:
>>>
>>>  // Get the hitlist by using osg::Viewer::computeIntersection(...)
>>>  const osgUtil::LineSegmentIntersector::Intersection&
>>>    intersection = *(hitlist.begin())
>>>  osg::Geometry* geometry = intersection.drawable->asGeometry()
>>>
>>> Then i used intersection.indexList and the geometry's VertexArray to
>>> iterate through all vertices to find the closest vertex (vx) wrt the
>>> intersection point.
>>> Then I calculated the angles between vx and the both neighbouring
>>> vertices in the indexList to determine which one belongs to the closest
>>> edge. Finally, the nodePath gave me the local=>world transformation.
>>>
>>> All of that only worked because we had some bad code to load/convert our
>>> own scene format into OSG. This code generated seperate triangles or
>>> quads, so actually I always hit a polygon with 3 or 4 vertices, what
>>> made it easy to determinie the neighbours of vx.
>>>
>>> Now that we're using some optimization steps (e.g. triangle strips), I
>>> can't use the above code (e.g. the indexList is empty). I tried to use
>>> the geometry's IndexArray instead, but the problem is that without
>>> knowing the exact primitive type, it is hard to determine which vertices
>>> are the neighbouring ones to find the edge. E.g. in case of an triangle
>>> strip I would have to check the last 2 and next 2 vertices in the
>>> index/vertex list. Also the code won't work if the drawable can't be
>>> cast to a Geometry.
>>>
>>> So my question is, if there's a more easy or flexible way to determine
>>> the closest vertex and edge of the intersected polygon/primitve?
>>>
>>> Looking forward to your ideas or solutions, if something similar was
>>> already discussed here.....
>>>
>>>  Simon
>>>
>>> _______________________________________________
>>> osg-users mailing list
>>> osg-users-ZwoEplunGu0hajLcUbyfC12AsgEQdTeF at public.gmane.org
>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>



More information about the osg-users mailing list