<div>Hi All,</div>
<div>&nbsp;</div>
<div>Dean:</div>
<div>thanks for pointing out the widget classes. I remembered needing some sort of transformation matrix to get point from one frame of referece to another but didn&#39;t know how to do this in vtk and the classes you pointed out were perfect example for it. Thanks again.
</div>
<div>So now I have obtained the motion vector, but do you know how can I constrain this motion to the view plain only. I guess what I need is to project the vector onto the view plane and use the projection as the new motion vector, is this right ?
</div>
<div>&nbsp;</div>
<div>Geoframer, <span class="ppt" id="_user_henrik.westerberg@crg.es">Henrik:</span></div>
<div><span class="ppt">You don&#39;t need to go through all that trouble to create many actors and then try to get their center , etc. I used to do that until I found the better way (use GeneratePointIdsOn() of the glygh class). Below is an example of how to do it in c++:
</span></div>
<div><span class="ppt"></span>&nbsp;</div>
<div><span class="ppt">
<p><font face="">#include &quot;vtkPolyDataMapper.h&quot;<br>#include &quot;vtkRenderWindow.h&quot;<br>#include &quot;vtkActor.h&quot;<br>#include &quot;vtkRenderer.h&quot;<br>#include &quot;vtkRenderWindowInteractor.h&quot;
<br>#include &quot;vtkInteractorStyleTrackballCamera.h&quot;<br>#include &quot;vtkProperty.h&quot;<br>#include &quot;vtkPolyData.h&quot;<br>#include &quot;vtkCell.h&quot;<br>#include &quot;vtkCellData.h&quot;<br>#include &quot;
vtkSphereSource.h&quot;<br>#include &quot;vtkGlyph3D.h&quot;<br>#include &quot;vtkRendererCollection.h&quot;<br>#include &quot;vtkCommand.h&quot;<br>#include &quot;vtkCellPicker.h&quot;<br>#include &quot;vtkPointData.h&quot;
<br>#include &quot;vtkIdTypeArray.h&quot;</font></p>
<p><font face="">class ActionHandler : public vtkCommand<br>{<br>&nbsp;&nbsp;&nbsp; public:<br>&nbsp;&nbsp;&nbsp; static ActionHandler *New(){ return new ActionHandler; }<br>&nbsp;&nbsp;&nbsp; virtual void Execute(vtkObject *caller, unsigned long eventid, void *unUsed)
<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkRenderWindowInteractor *iren = (vtkRenderWindowInteractor *)caller;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkRenderer *ren = (vtkRenderer *)iren-&gt;GetRenderWindow()-&gt;GetRenderers()-&gt;GetItemAsObject(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkCellPicker *cellPicker = (vtkCellPicker *)iren-&gt;GetPicker();
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mouseX, mouseY;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iren-&gt;GetEventPosition(mouseX, mouseY);</font></p>
<p><font face="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int cellID = cellPicker-&gt;Pick(mouseX,mouseY,0,ren);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( cellID == 0 || (cellID = cellPicker-&gt;GetCellId()) == -1 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; // nothing is picked<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkActor *pickedActor = cellPicker-&gt;GetActor();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkPolyData *pd = (vtkPolyData *)pickedActor-&gt;GetMapper()-&gt;GetInput();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkCell *pickedCell = pd-&gt;GetCell(cellID);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int pnt1 = pickedCell-&gt;GetPointId(0); // get one of the&nbsp;cell points<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkIdTypeArray *InpPntIds = (vtkIdTypeArray *)pd-&gt;GetPointData()-&gt;GetArray(&quot;InputPointIds&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( InpPntIds )
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int id = (int)InpPntIds-&gt;GetTuple1(pnt1); // get the input point corresponding to this cell point<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;Picked vertex %d\n&quot;, id);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>};</font></p>
<p><font face="">vtkPolyData *makeTempPoly()<br>{<br>&nbsp;&nbsp;&nbsp; double pnts[4][3] = { {0,0,0}, {10,0,0}, {10,10,0}, {0,10,0} };<br>&nbsp;&nbsp;&nbsp; vtkPolyData *pd = vtkPolyData::New();<br>&nbsp;&nbsp;&nbsp; vtkPoints *points = vtkPoints::New();</font></p>

<p><font face="">&nbsp;&nbsp;&nbsp; pd-&gt;SetPoints( points );<br>&nbsp;&nbsp;&nbsp; pd-&gt;Allocate();<br>&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;4; i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; points-&gt;InsertPoint(i, pnts[i][0], pnts[i][1], pnts[i][2]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pd-&gt;InsertNextCell(VTK_VERTEX, 1, &amp;i);
<br>&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="">&nbsp;&nbsp;&nbsp; vtkIntArray *cell_scalars = vtkIntArray::New();<br>&nbsp;&nbsp;&nbsp; cell_scalars-&gt;SetNumberOfComponents(1);<br>&nbsp;&nbsp;&nbsp; for( int i=0; i&lt;4; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell_scalars-&gt;InsertNextTuple1(i);<br>&nbsp;&nbsp;&nbsp; pd-&gt;GetCellData()-&gt;SetScalars(cell_scalars); 
</font></p>
<p><font face="">&nbsp;&nbsp;&nbsp; return pd;<br>}</font></p>
<p><font face="">int main()<br>{<br>&nbsp;&nbsp;&nbsp; // Create graphics stuff<br>&nbsp;&nbsp;&nbsp; vtkRenderer *ren = vtkRenderer::New();<br>&nbsp;&nbsp;&nbsp; ren-&gt;SetBackground(0.1,0.2,0.4);</font></p>
<p><font face="">&nbsp;&nbsp;&nbsp; vtkRenderWindow *renWin = vtkRenderWindow::New();<br>&nbsp;&nbsp;&nbsp; renWin-&gt;SetSize(800,600);<br>&nbsp;&nbsp;&nbsp; renWin-&gt;AddRenderer(ren);</font></p>
<p><font face="">&nbsp;&nbsp;&nbsp; vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();<br>&nbsp;&nbsp;&nbsp; iren-&gt;SetInteractorStyle( vtkInteractorStyleTrackballCamera::New() );<br>&nbsp;&nbsp;&nbsp; iren-&gt;SetRenderWindow(renWin);</font></p>

<p><font face="">&nbsp;&nbsp;&nbsp; vtkPolyData *pd1 = makeTempPoly();&nbsp; </font></p>
<p><font face="">&nbsp;&nbsp;&nbsp; vtkSphereSource *src = vtkSphereSource::New();<br>&nbsp;&nbsp;&nbsp; src-&gt;SetRadius(0.2);<br>&nbsp;&nbsp;&nbsp; src-&gt;SetThetaResolution(12);<br>&nbsp;&nbsp;&nbsp; src-&gt;SetPhiResolution(12);</font></p>
<p><font face="">&nbsp;&nbsp;&nbsp; vtkGlyph3D *glyph = vtkGlyph3D::New();<br>&nbsp;&nbsp;&nbsp; glyph-&gt;SetInput(pd1);<br>&nbsp;&nbsp;&nbsp; glyph-&gt;SetSource(src-&gt;GetOutput());<br>&nbsp;&nbsp;&nbsp; glyph-&gt;GeneratePointIdsOn();</font></p>
<p><font face="">&nbsp;&nbsp;&nbsp; vtkPolyDataMapper *mapper1 = vtkPolyDataMapper::New();<br>&nbsp;&nbsp;&nbsp; mapper1-&gt;SetInput( glyph-&gt;GetOutput() );<br>&nbsp;&nbsp;&nbsp; mapper1-&gt;ScalarVisibilityOff();<br>&nbsp;&nbsp;&nbsp; mapper1-&gt;GlobalImmediateModeRenderingOn();
</font></p>
<p><font face="">&nbsp;&nbsp;&nbsp; vtkActor *actor1 = vtkActor::New();<br>&nbsp;&nbsp;&nbsp; actor1-&gt;SetMapper( mapper1 );<br>&nbsp;&nbsp;&nbsp; actor1-&gt;GetProperty()-&gt;SetColor(1,0,0);<br>&nbsp;&nbsp;&nbsp; actor1-&gt;GetProperty()-&gt;SetPointSize(4);</font></p>
<p><font face="">&nbsp;&nbsp;&nbsp; vtkCellPicker *cellPicker = vtkCellPicker::New();<br>&nbsp;&nbsp;&nbsp; cellPicker-&gt;SetTolerance(0.001);<br>&nbsp;&nbsp;&nbsp; iren-&gt;SetPicker(cellPicker);</font></p>
<p><font face="">&nbsp;&nbsp;&nbsp; ActionHandler *h = ActionHandler::New();<br>&nbsp;&nbsp;&nbsp; iren-&gt;AddObserver(vtkCommand::LeftButtonPressEvent, h, 1);</font></p>
<p><font face="">&nbsp;&nbsp;&nbsp; ren-&gt;AddActor(actor1);<br>&nbsp;&nbsp;&nbsp; iren-&gt;Initialize();<br>&nbsp;&nbsp;&nbsp; iren-&gt;Start();</font></p>
<p><font face="">&nbsp;&nbsp;&nbsp; return 0;<br>}<br></font></p></span></div>