<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'><div dir='ltr'>
Hi Dominik!<BR>&nbsp;<BR>Thank you for your reply.&nbsp;&nbsp;I&nbsp;tried what you suggested and included the update&nbsp;just before I get the release position of&nbsp;the mouse.&nbsp;&nbsp;It seems to be the most&nbsp;logical place to do so to me.&nbsp; However, there is still no change in the output.<BR><br>I was thinking maybe the problem&nbsp;lies with&nbsp;the coordinates returned themselves.<BR>&nbsp;<BR>Does anyone have any previous experience with this?<BR>&nbsp;<BR>Vashist<BR>&nbsp;<BR><div>&gt; Date: Fri, 17 Jun 2011 14:14:25 +0200<br>&gt; From: dominik@itis.ethz.ch<br>&gt; To: vashist14@yahoo.com<br>&gt; CC: vtkusers@vtk.org<br>&gt; Subject: Re: [vtkusers] Picking and dragging a vertex - points not moving to appropriate position<br>&gt; <br>&gt; Sounds very much like you miss dataset-&gt;Modified() somewhere.<br>&gt; <br>&gt; Dominik<br>&gt; <br>&gt; On Fri, Jun 17, 2011 at 10:41 AM, Vashist Purbhoo &lt;vashist14@hotmail.com&gt; wrote:<br>&gt; &gt; Hi vtkusers!<br>&gt; &gt;<br>&gt; &gt; I am trying to deform a 3D&nbsp;object by clicking and dragging its&nbsp;vertices.&nbsp; I<br>&gt; &gt; was able to adapt the "SelectAVertex.cxx" example<br>&gt; &gt; (http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/MoveAVertex)&nbsp;on the<br>&gt; &gt; vtk website to make it work with a polydata I&nbsp;create using vtkSphereSource.<br>&gt; &gt; To summarise, to deform the object I select a vertex by clicking on the<br>&gt; &gt; middle mouse button and&nbsp;drag the point&nbsp;to the new location I want.&nbsp; I render<br>&gt; &gt; the vertices of my object using<br>&gt; &gt; vtkVertexGlyphFilter as well as the surface of the object.<br>&gt; &gt;<br>&gt; &gt; The program works correctly if I select the points without changing the<br>&gt; &gt; initial view of the rendered object.&nbsp; However, once I change the view, for<br>&gt; &gt; example to access a point at the back of my object, the point no longer<br>&gt; &gt; moves to where I drag it.&nbsp; The coordinates returned do not correspond to the<br>&gt; &gt; position where i release&nbsp;the mouse button. &nbsp;I would highly appreciate if any<br>&gt; &gt; help/suggestions could be provided on how to&nbsp;solve this.<br>&gt; &gt;<br>&gt; &gt; Thank you.<br>&gt; &gt;<br>&gt; &gt; Vashist<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; #include &lt;vtkSmartPointer.h&gt;<br>&gt; &gt; #include &lt;vtkPointPicker.h&gt;<br>&gt; &gt; #include &lt;vtkRendererCollection.h&gt;<br>&gt; &gt; #include &lt;vtkProperty.h&gt;<br>&gt; &gt; #include &lt;vtkObjectFactory.h&gt;<br>&gt; &gt; #include &lt;vtkPolyDataMapper.h&gt;<br>&gt; &gt; #include &lt;vtkActor.h&gt;<br>&gt; &gt; #include &lt;vtkRenderWindow.h&gt;<br>&gt; &gt; #include &lt;vtkRenderer.h&gt;<br>&gt; &gt; #include &lt;vtkRenderWindowInteractor.h&gt;<br>&gt; &gt; #include &lt;vtkPolyData.h&gt;<br>&gt; &gt; #include &lt;vtkPointSource.h&gt;<br>&gt; &gt; #include &lt;vtkInteractorStyleJoystickActor.h&gt;<br>&gt; &gt; #include &lt;vtkAreaPicker.h&gt;<br>&gt; &gt; #include &lt;vtkVertexGlyphFilter.h&gt;<br>&gt; &gt; #include &lt;vtkIdFilter.h&gt;<br>&gt; &gt; #include &lt;vtkAssembly.h&gt;<br>&gt; &gt; #include &lt;vtkSphereSource.h&gt;<br>&gt; &gt; #include &lt;vtkExtractGeometry.h&gt;<br>&gt; &gt; #include &lt;vtkDataSetMapper.h&gt;<br>&gt; &gt; #include &lt;vtkUnstructuredGrid.h&gt;<br>&gt; &gt; #include &lt;vtkGlyph3D.h&gt;<br>&gt; &gt; #include &lt;vtkPointData.h&gt;<br>&gt; &gt; #include &lt;vtkIdTypeArray.h&gt;<br>&gt; &gt; #include &lt;vtkDataSetSurfaceFilter.h&gt;<br>&gt; &gt; #include &lt;vtkPlanes.h&gt;<br>&gt; &gt;<br>&gt; &gt; class InteractorStyle : public vtkInteractorStyleJoystickActor<br>&gt; &gt; {<br>&gt; &gt; &nbsp; public:<br>&gt; &gt; &nbsp;&nbsp;&nbsp; static InteractorStyle* New();<br>&gt; &gt; &nbsp;&nbsp;&nbsp; vtkTypeMacro(InteractorStyle,vtkInteractorStyleJoystickActor);<br>&gt; &gt;<br>&gt; &gt; &nbsp;&nbsp;&nbsp; InteractorStyle()<br>&gt; &gt; &nbsp;&nbsp;&nbsp; {<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Move = false;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;PointPicker = vtkSmartPointer&lt;vtkPointPicker&gt;::New();<br>&gt; &gt;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Setup ghost glyph<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkSmartPointer&lt;vtkPoints&gt; points = vtkSmartPointer&lt;vtkPoints&gt;::New();<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; points-&gt;InsertNextPoint(0,0,0);<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MovePolyData = vtkSmartPointer&lt;vtkPolyData&gt;::New();<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MovePolyData-&gt;SetPoints(points);<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveGlyphFilter = vtkSmartPointer&lt;vtkVertexGlyphFilter&gt;::New();<br>&gt; &gt;<br>&gt; &gt; this-&gt;MoveGlyphFilter-&gt;SetInputConnection(this-&gt;MovePolyData-&gt;GetProducerPort());<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveGlyphFilter-&gt;Update();<br>&gt; &gt;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveMapper = vtkSmartPointer&lt;vtkPolyDataMapper&gt;::New();<br>&gt; &gt;<br>&gt; &gt; this-&gt;MoveMapper-&gt;SetInputConnection(this-&gt;MoveGlyphFilter-&gt;GetOutputPort());<br>&gt; &gt;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor = vtkSmartPointer&lt;vtkActor&gt;::New();<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;SetMapper(this-&gt;MoveMapper);<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;VisibilityOff();<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;GetProperty()-&gt;SetPointSize(5);<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;GetProperty()-&gt;SetColor(1,0,0);<br>&gt; &gt; &nbsp;&nbsp;&nbsp; }<br>&gt; &gt; &nbsp;//_____________________________________________________________________________________<br>&gt; &gt; &nbsp;&nbsp; void OnMouseMove()<br>&gt; &gt; &nbsp;&nbsp;&nbsp; {<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!this-&gt;Move)<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkInteractorStyleJoystickActor::OnMouseMove();<br>&gt; &gt; &nbsp;&nbsp;&nbsp; }<br>&gt; &gt; &nbsp;//_____________________________________________________________________________________<br>&gt; &gt; &nbsp;&nbsp;&nbsp; void OnMiddleButtonUp()<br>&gt; &gt; &nbsp;&nbsp;&nbsp; {<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;EndPan();<br>&gt; &gt;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Move = false;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;VisibilityOff();<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Data-&gt;GetPoints()-&gt;SetPoint(this-&gt;SelectedPoint,<br>&gt; &gt; this-&gt;MoveActor-&gt;GetPosition());<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Data-&gt;Modified();<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;GetCurrentRenderer()-&gt;Render();<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;GetCurrentRenderer()-&gt;GetRenderWindow()-&gt;Render();<br>&gt; &gt;<br>&gt; &gt; &nbsp;&nbsp;&nbsp; }<br>&gt; &gt; //_____________________________________________________________________________________<br>&gt; &gt; &nbsp;&nbsp;&nbsp; void OnMiddleButtonDown()<br>&gt; &gt; &nbsp;&nbsp;&nbsp; {<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get the selected point<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x = this-&gt;Interactor-&gt;GetEventPosition()[0];<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int y = this-&gt;Interactor-&gt;GetEventPosition()[1];<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;FindPokedRenderer(x, y);<br>&gt; &gt;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;PointPicker-&gt;Pick(this-&gt;Interactor-&gt;GetEventPosition()[0],<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Interactor-&gt;GetEventPosition()[1],<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp; // always zero.<br>&gt; &gt;<br>&gt; &gt; this-&gt;Interactor-&gt;GetRenderWindow()-&gt;GetRenderers()-&gt;GetFirstRenderer());<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(this-&gt;PointPicker-&gt;GetPointId() &gt;= 0)<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;StartPan();<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;VisibilityOn();<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Move = true;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;SelectedPoint = this-&gt;PointPicker-&gt;GetPointId();<br>&gt; &gt;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; "Dragging point " &lt;&lt; this-&gt;SelectedPoint &lt;&lt; std::endl;<br>&gt; &gt;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double p[3];<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Data-&gt;GetPoint(this-&gt;SelectedPoint, p);<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; "p: " &lt;&lt; p[0] &lt;&lt; " " &lt;&lt; p[1] &lt;&lt; " " &lt;&lt; p[2] &lt;&lt;<br>&gt; &gt; std::endl;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;SetPosition(p);<br>&gt; &gt;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;GetCurrentRenderer()-&gt;AddActor(this-&gt;MoveActor);<br>&gt; &gt; &nbsp;&nbsp;this-&gt;InteractionProp = this-&gt;MoveActor;<br>&gt; &gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt; &gt; &nbsp;&nbsp;&nbsp; }<br>&gt; &gt; &nbsp;//_____________________________________________________________________________________<br>&gt; &gt; &nbsp; vtkPolyData* Data;<br>&gt; &gt; &nbsp; vtkPolyData* GlyphData;<br>&gt; &gt;<br>&gt; &gt; &nbsp; vtkSmartPointer&lt;vtkPolyDataMapper&gt; MoveMapper;<br>&gt; &gt; &nbsp; vtkSmartPointer&lt;vtkActor&gt; MoveActor;<br>&gt; &gt; &nbsp; vtkSmartPointer&lt;vtkPolyData&gt; MovePolyData;<br>&gt; &gt; &nbsp; vtkSmartPointer&lt;vtkVertexGlyphFilter&gt; MoveGlyphFilter;<br>&gt; &gt; &nbsp; vtkSmartPointer&lt;vtkPointPicker&gt; PointPicker;<br>&gt; &gt; &nbsp; bool Move;<br>&gt; &gt; &nbsp; vtkIdType SelectedPoint;<br>&gt; &gt; };<br>&gt; &gt; //_____________________________________________________________________________________<br>&gt; &gt; vtkStandardNewMacro(InteractorStyle);<br>&gt; &gt; //_____________________________________________________________________________________<br>&gt; &gt;<br>&gt; &gt; int main (int, char *[])<br>&gt; &gt; {<br>&gt; &gt; &nbsp;// Create a sphere (object to be deformed)<br>&gt; &gt; &nbsp;vtkSmartPointer&lt;vtkSphereSource&gt; sphereSource =<br>&gt; &gt; vtkSmartPointer&lt;vtkSphereSource&gt;::New();<br>&gt; &gt; &nbsp;sphereSource-&gt;SetCenter(20.0, 20.0, 20.0);<br>&gt; &gt; &nbsp;sphereSource-&gt;SetRadius(20.0);<br>&gt; &gt; &nbsp;sphereSource-&gt;SetThetaResolution(10);<br>&gt; &gt; &nbsp;sphereSource-&gt;SetPhiResolution(10);<br>&gt; &gt; &nbsp;sphereSource-&gt;Update();<br>&gt; &gt;<br>&gt; &gt; &nbsp;//Create polydata from sphereSource<br>&gt; &gt; &nbsp;vtkSmartPointer&lt;vtkPolyData&gt; points_poly =<br>&gt; &gt; vtkSmartPointer&lt;vtkPolyData&gt;::New();<br>&gt; &gt; &nbsp;points_poly-&gt;CopyStructure(sphereSource-&gt;GetOutput());<br>&gt; &gt;<br>&gt; &gt; &nbsp;vtkSmartPointer&lt;vtkVertexGlyphFilter&gt; glyphFilter<br>&gt; &gt; =&nbsp;vtkSmartPointer&lt;vtkVertexGlyphFilter&gt;::New();<br>&gt; &gt; &nbsp;glyphFilter-&gt;SetInputConnection(points_poly-&gt;GetProducerPort());<br>&gt; &gt; &nbsp;glyphFilter-&gt;Update();<br>&gt; &gt; &nbsp;// Create a mapper and actor<br>&gt; &gt; &nbsp;vtkSmartPointer&lt;vtkPolyDataMapper&gt; points_mapper =<br>&gt; &gt; vtkSmartPointer&lt;vtkPolyDataMapper&gt;::New();<br>&gt; &gt; &nbsp;points_mapper-&gt;SetInputConnection(glyphFilter-&gt;GetOutputPort());<br>&gt; &gt;<br>&gt; &gt; &nbsp;vtkSmartPointer&lt;vtkActor&gt; points_actor = vtkSmartPointer&lt;vtkActor&gt;::New();<br>&gt; &gt; &nbsp;points_actor-&gt;SetMapper(points_mapper);<br>&gt; &gt; &nbsp;points_actor-&gt;GetProperty()-&gt;SetPointSize(10);<br>&gt; &gt; &nbsp;vtkSmartPointer&lt;vtkPolyDataMapper&gt; Mapper2 =<br>&gt; &gt; vtkSmartPointer&lt;vtkPolyDataMapper&gt;::New();<br>&gt; &gt; &nbsp;Mapper2-&gt;SetInput(points_poly);<br>&gt; &gt;<br>&gt; &gt; &nbsp;vtkSmartPointer&lt;vtkActor&gt; Actor2 = vtkSmartPointer&lt;vtkActor&gt;::New();<br>&gt; &gt; &nbsp;Actor2-&gt;SetMapper(Mapper2);<br>&gt; &gt;<br>&gt; &gt; &nbsp;//assembly to synchronise interaction of points &amp; polydata<br>&gt; &gt; &nbsp;vtkSmartPointer&lt;vtkAssembly&gt; assembly<br>&gt; &gt; =&nbsp;vtkSmartPointer&lt;vtkAssembly&gt;::New();<br>&gt; &gt; &nbsp;assembly-&gt;AddPart(points_actor);<br>&gt; &gt; &nbsp;assembly-&gt;AddPart(Actor2);<br>&gt; &gt; &nbsp;// Visualize<br>&gt; &gt; &nbsp;vtkSmartPointer&lt;vtkRenderer&gt; renderer =<br>&gt; &gt; vtkSmartPointer&lt;vtkRenderer&gt;::New();<br>&gt; &gt; &nbsp;vtkSmartPointer&lt;vtkRenderWindow&gt; renderWindow =<br>&gt; &gt; vtkSmartPointer&lt;vtkRenderWindow&gt;::New();<br>&gt; &gt; &nbsp;renderWindow-&gt;AddRenderer(renderer);<br>&gt; &gt;<br>&gt; &gt; &nbsp;vtkSmartPointer&lt;vtkRenderWindowInteractor&gt; renderWindowInteractor =<br>&gt; &gt; &nbsp;&nbsp;vtkSmartPointer&lt;vtkRenderWindowInteractor&gt;::New();<br>&gt; &gt; &nbsp;renderWindowInteractor-&gt;SetRenderWindow(renderWindow);<br>&gt; &gt;<br>&gt; &gt; &nbsp;renderer-&gt;AddActor(assembly);<br>&gt; &gt;<br>&gt; &gt; &nbsp;renderWindow-&gt;Render();<br>&gt; &gt;<br>&gt; &gt; &nbsp;vtkSmartPointer&lt;InteractorStyle&gt; style =<br>&gt; &gt; vtkSmartPointer&lt;InteractorStyle&gt;::New();<br>&gt; &gt; &nbsp;renderWindowInteractor-&gt;SetInteractorStyle( style );<br>&gt; &gt; &nbsp;style-&gt;Data = points_poly;<br>&gt; &gt;<br>&gt; &gt; &nbsp;renderWindowInteractor-&gt;Start();<br>&gt; &gt; &nbsp;return EXIT_SUCCESS;<br>&gt; &gt; }<br>&gt; &gt;<br>&gt; &gt; _______________________________________________<br>&gt; &gt; Powered by www.kitware.com<br>&gt; &gt;<br>&gt; &gt; Visit other Kitware open-source projects at<br>&gt; &gt; http://www.kitware.com/opensource/opensource.html<br>&gt; &gt;<br>&gt; &gt; Please keep messages on-topic and check the VTK FAQ at:<br>&gt; &gt; http://www.vtk.org/Wiki/VTK_FAQ<br>&gt; &gt;<br>&gt; &gt; Follow this link to subscribe/unsubscribe:<br>&gt; &gt; http://www.vtk.org/mailman/listinfo/vtkusers<br>&gt; &gt;<br>&gt; &gt;<br>&gt; _______________________________________________<br>&gt; Powered by www.kitware.com<br>&gt; <br>&gt; Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html<br>&gt; <br>&gt; Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ<br>&gt; <br>&gt; Follow this link to subscribe/unsubscribe:<br>&gt; http://www.vtk.org/mailman/listinfo/vtkusers<br></div>                                               </div></body>
</html>