<div dir="ltr"><div><div><div><div><div>HI Jannik,<br><br></div>I haven't had a look at the modified example yet, it's the weekend so I'm just briefly online.  Quick thoughts are:<br><br></div>  inverting a zero'd matrix will naturally lead to an invalid matrix.<br><br></div>My inclination is that the case where a zero matrix could be produced is a special case that needs to be caught higher up in the calling methods rather than try and implement so lower level workaround.<br><br></div>The actual concept behind the transformations that are being done of the line segment is transform into the coordinate frame of a subgraph and then trimming it so that you only test the extents that intersect that subgaph's bounding volume.  If a bounding volume is invalid then you can't do this test and clip.<br><br>For a zero radius bounding sphere, such as a sub-graph that contains just a single point then this is a special case - the line segment would have to exactly pass through the centre of the bounding sphere.  One approach this might be to always increase the radius of the sphere by an epsilon so it;'s not non zero and do the test and clip against this.  epsilon's are already used elsewhere in LineSegmentIntersector,  I need to get back to me family now so can't look further into the topic.<br><br></div>Robert.<br><div><div><div><br><br></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 21 November 2015 at 16:02, Jannik Heller <span dir="ltr"><<a href="mailto:scrawl@baseoftrash.de" target="_blank">scrawl@baseoftrash.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
The LineSegmentIntersector creates NaN warnings when applied to a node with zero scale. I've attached a 3 line change to osgintersection.cpp to reproduce the issue.<br>
<br>
The NaN's first pop up when OSG tries to invert a zero matrix here: <a href="https://github.com/openscenegraph/osg/blob/master/src/osgUtil/LineSegmentIntersector.cpp#L294" rel="noreferrer" target="_blank">https://github.com/openscenegraph/osg/blob/master/src/osgUtil/LineSegmentIntersector.cpp#L294</a><br>
<br>
Check with the following code snippet:<br>
<br>
Code:<br>
<br>
        osg::Matrix zero(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1);<br>
<br>
        if (zero.invert(zero))<br>
            std::cout << "inverted " << zero << std::endl;<br>
<br>
<br>
<br>
invert() returns true but the inverted matrix is<br>
<br>
inverted {<br>
        -nan -nan -nan 0<br>
        -nan -nan -nan 0<br>
        -nan -nan -nan 0<br>
        nan nan nan 1<br>
}<br>
<br>
This looks like a bug in the Matrix invert function.<br>
<br>
However even if the matrix was still zero instead of NaN, there is another issue here:<br>
<br>
    osg::ref_ptr<LineSegmentIntersector> lsi = new LineSegmentIntersector(_start * matrix, _end * matrix);<br>
<br>
Multiplying a vec3 with a zero matrix will cause NaN's, because there is an 1.0 / (mat * vec ...) in the Matrix::preMult(Vec3) function.<br>
<br>
Not sure on the best way to fix this. Should we add explicit checks for zero scaled matrices in the LineSegmentIntersector, or fix the Matrix and Vec classes so they don't produce NaN's under any circumstances for (borderline) valid input? The latter seems the cleaner fix but would have a performance impact all over OSG.<br>
<br>
Thank you!<br>
<br>
Cheers,<br>
Jannik<br>
<br>
------------------<br>
Read this topic online here:<br>
<a href="http://forum.openscenegraph.org/viewtopic.php?p=65720#65720" rel="noreferrer" target="_blank">http://forum.openscenegraph.org/viewtopic.php?p=65720#65720</a><br>
<br>
<br>
<br>
<br>_______________________________________________<br>
osg-users mailing list<br>
<a href="mailto:osg-users@lists.openscenegraph.org">osg-users@lists.openscenegraph.org</a><br>
<a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" rel="noreferrer" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
<br></blockquote></div><br></div>