<div>Hi All,</div>
<div> </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'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> </div>
<div>Geoframer, <span class="ppt" id="_user_henrik.westerberg@crg.es">Henrik:</span></div>
<div><span class="ppt">You don'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> </div>
<div><span class="ppt">
<p><font face="">#include "vtkPolyDataMapper.h"<br>#include "vtkRenderWindow.h"<br>#include "vtkActor.h"<br>#include "vtkRenderer.h"<br>#include "vtkRenderWindowInteractor.h"
<br>#include "vtkInteractorStyleTrackballCamera.h"<br>#include "vtkProperty.h"<br>#include "vtkPolyData.h"<br>#include "vtkCell.h"<br>#include "vtkCellData.h"<br>#include "
vtkSphereSource.h"<br>#include "vtkGlyph3D.h"<br>#include "vtkRendererCollection.h"<br>#include "vtkCommand.h"<br>#include "vtkCellPicker.h"<br>#include "vtkPointData.h"
<br>#include "vtkIdTypeArray.h"</font></p>
<p><font face="">class ActionHandler : public vtkCommand<br>{<br> public:<br> static ActionHandler *New(){ return new ActionHandler; }<br> virtual void Execute(vtkObject *caller, unsigned long eventid, void *unUsed)
<br> {<br> vtkRenderWindowInteractor *iren = (vtkRenderWindowInteractor *)caller;<br> vtkRenderer *ren = (vtkRenderer *)iren->GetRenderWindow()->GetRenderers()->GetItemAsObject(0);<br> vtkCellPicker *cellPicker = (vtkCellPicker *)iren->GetPicker();
<br> int mouseX, mouseY;<br> iren->GetEventPosition(mouseX, mouseY);</font></p>
<p><font face=""> int cellID = cellPicker->Pick(mouseX,mouseY,0,ren);<br> if ( cellID == 0 || (cellID = cellPicker->GetCellId()) == -1 )<br> {<br> return; // nothing is picked<br> }
<br> else<br> {<br> vtkActor *pickedActor = cellPicker->GetActor();<br> vtkPolyData *pd = (vtkPolyData *)pickedActor->GetMapper()->GetInput();<br> vtkCell *pickedCell = pd->GetCell(cellID);
<br> int pnt1 = pickedCell->GetPointId(0); // get one of the cell points<br> vtkIdTypeArray *InpPntIds = (vtkIdTypeArray *)pd->GetPointData()->GetArray("InputPointIds");<br> if ( InpPntIds )
<br> {<br> int id = (int)InpPntIds->GetTuple1(pnt1); // get the input point corresponding to this cell point<br> printf("Picked vertex %d\n", id);<br> }<br>
}<br> }<br>};</font></p>
<p><font face="">vtkPolyData *makeTempPoly()<br>{<br> double pnts[4][3] = { {0,0,0}, {10,0,0}, {10,10,0}, {0,10,0} };<br> vtkPolyData *pd = vtkPolyData::New();<br> vtkPoints *points = vtkPoints::New();</font></p>
<p><font face=""> pd->SetPoints( points );<br> pd->Allocate();<br> for(int i=0; i<4; i++)<br> {<br> points->InsertPoint(i, pnts[i][0], pnts[i][1], pnts[i][2]);<br> pd->InsertNextCell(VTK_VERTEX, 1, &i);
<br> }</font></p>
<p><font face=""> vtkIntArray *cell_scalars = vtkIntArray::New();<br> cell_scalars->SetNumberOfComponents(1);<br> for( int i=0; i<4; i++)<br> cell_scalars->InsertNextTuple1(i);<br> pd->GetCellData()->SetScalars(cell_scalars);
</font></p>
<p><font face=""> return pd;<br>}</font></p>
<p><font face="">int main()<br>{<br> // Create graphics stuff<br> vtkRenderer *ren = vtkRenderer::New();<br> ren->SetBackground(0.1,0.2,0.4);</font></p>
<p><font face=""> vtkRenderWindow *renWin = vtkRenderWindow::New();<br> renWin->SetSize(800,600);<br> renWin->AddRenderer(ren);</font></p>
<p><font face=""> vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();<br> iren->SetInteractorStyle( vtkInteractorStyleTrackballCamera::New() );<br> iren->SetRenderWindow(renWin);</font></p>
<p><font face=""> vtkPolyData *pd1 = makeTempPoly(); </font></p>
<p><font face=""> vtkSphereSource *src = vtkSphereSource::New();<br> src->SetRadius(0.2);<br> src->SetThetaResolution(12);<br> src->SetPhiResolution(12);</font></p>
<p><font face=""> vtkGlyph3D *glyph = vtkGlyph3D::New();<br> glyph->SetInput(pd1);<br> glyph->SetSource(src->GetOutput());<br> glyph->GeneratePointIdsOn();</font></p>
<p><font face=""> vtkPolyDataMapper *mapper1 = vtkPolyDataMapper::New();<br> mapper1->SetInput( glyph->GetOutput() );<br> mapper1->ScalarVisibilityOff();<br> mapper1->GlobalImmediateModeRenderingOn();
</font></p>
<p><font face=""> vtkActor *actor1 = vtkActor::New();<br> actor1->SetMapper( mapper1 );<br> actor1->GetProperty()->SetColor(1,0,0);<br> actor1->GetProperty()->SetPointSize(4);</font></p>
<p><font face=""> vtkCellPicker *cellPicker = vtkCellPicker::New();<br> cellPicker->SetTolerance(0.001);<br> iren->SetPicker(cellPicker);</font></p>
<p><font face=""> ActionHandler *h = ActionHandler::New();<br> iren->AddObserver(vtkCommand::LeftButtonPressEvent, h, 1);</font></p>
<p><font face=""> ren->AddActor(actor1);<br> iren->Initialize();<br> iren->Start();</font></p>
<p><font face=""> return 0;<br>}<br></font></p></span></div>