I am trying to intersect a ray with a triangulated mesh. I see that vtkOBBTree is derived from vtkCellLocator, but they both have a IntersectWithLine function. When should I use a vtkOBBTree vs a vtkCellLocator?<br><br>I tried to use a CellLocator to find the intersection with a triangle (vertices [0,0,0], [1,0,0], [0,1,0]) and a line segment (end points [.5, .5, 1], [.5, .5, -1]).<br>
<br>It doesn&#39;t seem to give the result of (.5, .5, 0) as I would expect - instead all the values seem to be uninitialized.<br><br>Here is the function declaration:<br>virtual int <a class="el" href="http://www.vtk.org/doc/release/4.0/html/classvtkCellLocator.html#a9">IntersectWithLine</a> (float a0[3], float a1[3], float tol, float &amp;t, float x[3], float pcoords[3], int &amp;subId)<br>
<br>I&#39;m assuming a0 and a1 are the endpoints of the line? tol is the tolerance for the intersection calculation, x is the point of intersection.  Then what is pcoords and subId??<br><br>Here is my example code:<br><br>
#include &lt;vtkCellArray.h&gt;<br>#include &lt;vtkPoints.h&gt;<br>#include &lt;vtkTriangle.h&gt;<br>#include &lt;vtkPolyData.h&gt;<br>#include &lt;vtkPointData.h&gt;<br>#include &lt;vtkLine.h&gt;<br>#include &lt;vtkCellLocator.h&gt;<br>
#include &lt;vtkSmartPointer.h&gt;<br><br>#include &lt;iostream&gt;<br><br><br>int main(int argc, char *argv[])<br>{<br>    //create the points<br>    vtkSmartPointer&lt;vtkPoints&gt; points = vtkSmartPointer&lt;vtkPoints&gt;::New();<br>
    points-&gt;InsertNextPoint(1.0, 0.0, 0.0);<br>    points-&gt;InsertNextPoint(0.0, 0.0, 0.0);<br>    points-&gt;InsertNextPoint(0.0, 1.0, 0.0);<br>        <br>    //create the triangles<br>    vtkSmartPointer&lt;vtkCellArray&gt; triangles = vtkSmartPointer&lt;vtkCellArray&gt;::New();<br>
<br>    vtkSmartPointer&lt;vtkTriangle&gt; triangle = vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>    triangle-&gt;GetPointIds()-&gt;SetId(0,0);<br>    triangle-&gt;GetPointIds()-&gt;SetId(1,1);<br>    triangle-&gt;GetPointIds()-&gt;SetId(2,2);<br>
    triangles-&gt;InsertNextCell(triangle);<br>    <br>    vtkSmartPointer&lt;vtkPolyData&gt; polydata = vtkPolyData::New();<br><br>    polydata-&gt;SetPoints(points);<br>    polydata-&gt;SetPolys(triangles);<br>    <br>    //create the locator<br>
    vtkCellLocator* Locator = vtkCellLocator::New();<br>    Locator-&gt;SetDataSet(polydata);<br><br>    //intersect the locator with the line<br>    double LineP0[3] = {0.5, 0.5, 1.0};<br>    double LineP1[3] = {0.5, 0.5, -1.0};<br>
    double t;<br>    double x[3];<br>    double pcoords[3];<br>    int subId;<br>    Locator-&gt;IntersectWithLine(LineP0, LineP1, 1e-6, t, x, pcoords, subId);<br><br>    std::cout &lt;&lt; &quot;t: &quot; &lt;&lt; t &lt;&lt; std::endl;<br>
    std::cout &lt;&lt; &quot;subId: &quot; &lt;&lt; subId &lt;&lt; std::endl;<br>    std::cout &lt;&lt; &quot;x: &quot; &lt;&lt; x[0] &lt;&lt; &quot; &quot; &lt;&lt; x[1] &lt;&lt; &quot; &quot; &lt;&lt; x[2] &lt;&lt; std::endl;<br>
    std::cout &lt;&lt; &quot;pcoords: &quot; &lt;&lt; pcoords[0] &lt;&lt; &quot; &quot; &lt;&lt; pcoords[1] &lt;&lt; &quot; &quot; &lt;&lt; pcoords[2] &lt;&lt; std::endl;<br>    <br>    <br>    return 0;<br>}<br><br><br>Anyone see what is wrong with that? I assume it is with my missing understanding of pcoords because it is not passed by reference and therefore I am passing in uninitialized values - thoughts?<br>
<br clear="all">Thanks,<br><br>David<br>