<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 vtkusers!<BR>&nbsp;<BR>I am trying to deform a 3D&nbsp;object by clicking and dragging its&nbsp;vertices.&nbsp; I was able to adapt the "SelectAVertex.cxx" example (<a href="http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/MoveAVertex">http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/MoveAVertex</a>)&nbsp;on the vtk website to make it work with a polydata I&nbsp;create using vtkSphereSource.&nbsp; To summarise, to deform the object I select a vertex by clicking on the middle mouse button and&nbsp;drag the point&nbsp;to the new location I want.&nbsp; I render the vertices of my object using <font size="2"><BR>vtkVertexGlyphFilter as well as the surface of the object.&nbsp; <BR></font>&nbsp;<BR>The program works correctly if I select the points without changing the initial view of the rendered object.&nbsp; However, once I change the view, for example to access a point at the back of my object, the point no longer moves to where I drag it.&nbsp; The coordinates returned do not correspond to the position where i release&nbsp;the mouse button. &nbsp;I would highly appreciate if any help/suggestions could be provided on how to&nbsp;solve this.&nbsp; <BR>&nbsp;<BR>Thank you.<BR>&nbsp;<BR>Vashist<BR>&nbsp;<BR>&nbsp;<BR>#include &lt;vtkSmartPointer.h&gt;<br>#include &lt;vtkPointPicker.h&gt;<br>#include &lt;vtkRendererCollection.h&gt;<br>#include &lt;vtkProperty.h&gt;<br>#include &lt;vtkObjectFactory.h&gt;<br>#include &lt;vtkPolyDataMapper.h&gt;<br>#include &lt;vtkActor.h&gt;<br>#include &lt;vtkRenderWindow.h&gt;<br>#include &lt;vtkRenderer.h&gt;<br>#include &lt;vtkRenderWindowInteractor.h&gt;<br>#include &lt;vtkPolyData.h&gt;<br>#include &lt;vtkPointSource.h&gt;<br>#include &lt;vtkInteractorStyleJoystickActor.h&gt;<br>#include &lt;vtkAreaPicker.h&gt;<br>#include &lt;vtkVertexGlyphFilter.h&gt;<br>#include &lt;vtkIdFilter.h&gt;<br>#include &lt;vtkAssembly.h&gt;<br>#include &lt;vtkSphereSource.h&gt;<br>#include &lt;vtkExtractGeometry.h&gt;<br>#include &lt;vtkDataSetMapper.h&gt;<br>#include &lt;vtkUnstructuredGrid.h&gt;<br>#include &lt;vtkGlyph3D.h&gt;<br>#include &lt;vtkPointData.h&gt;<br>#include &lt;vtkIdTypeArray.h&gt;<br>#include &lt;vtkDataSetSurfaceFilter.h&gt;<br>#include &lt;vtkPlanes.h&gt;<BR>&nbsp;<br>class InteractorStyle : public vtkInteractorStyleJoystickActor&nbsp;&nbsp;<br>{<br>&nbsp; public:<br>&nbsp;&nbsp;&nbsp; static InteractorStyle* New();<br>&nbsp;&nbsp;&nbsp; vtkTypeMacro(InteractorStyle,vtkInteractorStyleJoystickActor);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; InteractorStyle()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Move = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;PointPicker = vtkSmartPointer&lt;vtkPointPicker&gt;::New();<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Setup ghost glyph<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkSmartPointer&lt;vtkPoints&gt; points = vtkSmartPointer&lt;vtkPoints&gt;::New();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; points-&gt;InsertNextPoint(0,0,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MovePolyData = vtkSmartPointer&lt;vtkPolyData&gt;::New();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MovePolyData-&gt;SetPoints(points);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveGlyphFilter = vtkSmartPointer&lt;vtkVertexGlyphFilter&gt;::New();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveGlyphFilter-&gt;SetInputConnection(this-&gt;MovePolyData-&gt;GetProducerPort());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveGlyphFilter-&gt;Update();<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveMapper = vtkSmartPointer&lt;vtkPolyDataMapper&gt;::New();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveMapper-&gt;SetInputConnection(this-&gt;MoveGlyphFilter-&gt;GetOutputPort());<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor = vtkSmartPointer&lt;vtkActor&gt;::New();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;SetMapper(this-&gt;MoveMapper);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;VisibilityOff();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;GetProperty()-&gt;SetPointSize(5);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;GetProperty()-&gt;SetColor(1,0,0);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;//_____________________________________________________________________________________<br>&nbsp;&nbsp; void OnMouseMove()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!this-&gt;Move)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkInteractorStyleJoystickActor::OnMouseMove();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;//_____________________________________________________________________________________<br>&nbsp;&nbsp;&nbsp; void OnMiddleButtonUp()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;EndPan();<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Move = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;VisibilityOff();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Data-&gt;GetPoints()-&gt;SetPoint(this-&gt;SelectedPoint, this-&gt;MoveActor-&gt;GetPosition());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Data-&gt;Modified();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;GetCurrentRenderer()-&gt;Render();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;GetCurrentRenderer()-&gt;GetRenderWindow()-&gt;Render();<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; }<br>//_____________________________________________________________________________________<br>&nbsp;&nbsp;&nbsp; void OnMiddleButtonDown()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get the selected point<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x = this-&gt;Interactor-&gt;GetEventPosition()[0];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int y = this-&gt;Interactor-&gt;GetEventPosition()[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;FindPokedRenderer(x, y);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;PointPicker-&gt;Pick(this-&gt;Interactor-&gt;GetEventPosition()[0],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Interactor-&gt;GetEventPosition()[1],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp; // always zero.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Interactor-&gt;GetRenderWindow()-&gt;GetRenderers()-&gt;GetFirstRenderer());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(this-&gt;PointPicker-&gt;GetPointId() &gt;= 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;StartPan();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;VisibilityOn();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Move = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;SelectedPoint = this-&gt;PointPicker-&gt;GetPointId();<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; "Dragging point " &lt;&lt; this-&gt;SelectedPoint &lt;&lt; std::endl;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double p[3];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;Data-&gt;GetPoint(this-&gt;SelectedPoint, p);<br>&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; std::endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;MoveActor-&gt;SetPosition(p);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;GetCurrentRenderer()-&gt;AddActor(this-&gt;MoveActor);<br>&nbsp;&nbsp;this-&gt;InteractionProp = this-&gt;MoveActor;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;//_____________________________________________________________________________________<br>&nbsp; vtkPolyData* Data;<br>&nbsp; vtkPolyData* GlyphData;<br>&nbsp;<br>&nbsp; vtkSmartPointer&lt;vtkPolyDataMapper&gt; MoveMapper;<br>&nbsp; vtkSmartPointer&lt;vtkActor&gt; MoveActor;<br>&nbsp; vtkSmartPointer&lt;vtkPolyData&gt; MovePolyData;<br>&nbsp; vtkSmartPointer&lt;vtkVertexGlyphFilter&gt; MoveGlyphFilter;<br>&nbsp; vtkSmartPointer&lt;vtkPointPicker&gt; PointPicker;<BR>&nbsp; bool Move;<br>&nbsp; vtkIdType SelectedPoint;<br>};<br>//_____________________________________________________________________________________<br>vtkStandardNewMacro(InteractorStyle);<br>//_____________________________________________________________________________________<br>&nbsp;<br>int main (int, char *[])<br>{<br>&nbsp;// Create a sphere (object to be deformed)<br>&nbsp;vtkSmartPointer&lt;vtkSphereSource&gt; sphereSource = vtkSmartPointer&lt;vtkSphereSource&gt;::New();<br>&nbsp;sphereSource-&gt;SetCenter(20.0, 20.0, 20.0);<br>&nbsp;sphereSource-&gt;SetRadius(20.0);<br>&nbsp;sphereSource-&gt;SetThetaResolution(10);<br>&nbsp;sphereSource-&gt;SetPhiResolution(10);<br>&nbsp;sphereSource-&gt;Update();<br>&nbsp;<br>&nbsp;//Create polydata from sphereSource<br>&nbsp;vtkSmartPointer&lt;vtkPolyData&gt; points_poly = vtkSmartPointer&lt;vtkPolyData&gt;::New();<br>&nbsp;points_poly-&gt;CopyStructure(sphereSource-&gt;GetOutput());<br>&nbsp;<br>&nbsp;vtkSmartPointer&lt;vtkVertexGlyphFilter&gt; glyphFilter =&nbsp;vtkSmartPointer&lt;vtkVertexGlyphFilter&gt;::New();<br>&nbsp;glyphFilter-&gt;SetInputConnection(points_poly-&gt;GetProducerPort());<br>&nbsp;glyphFilter-&gt;Update();<BR>&nbsp;// Create a mapper and actor<br>&nbsp;vtkSmartPointer&lt;vtkPolyDataMapper&gt; points_mapper = vtkSmartPointer&lt;vtkPolyDataMapper&gt;::New();<br>&nbsp;points_mapper-&gt;SetInputConnection(glyphFilter-&gt;GetOutputPort());<br>&nbsp; <br>&nbsp;vtkSmartPointer&lt;vtkActor&gt; points_actor = vtkSmartPointer&lt;vtkActor&gt;::New();<br>&nbsp;points_actor-&gt;SetMapper(points_mapper);<br>&nbsp;points_actor-&gt;GetProperty()-&gt;SetPointSize(10);<BR>&nbsp;vtkSmartPointer&lt;vtkPolyDataMapper&gt; Mapper2 = vtkSmartPointer&lt;vtkPolyDataMapper&gt;::New();<br>&nbsp;Mapper2-&gt;SetInput(points_poly);<br>&nbsp;<br>&nbsp;vtkSmartPointer&lt;vtkActor&gt; Actor2 = vtkSmartPointer&lt;vtkActor&gt;::New();<br>&nbsp;Actor2-&gt;SetMapper(Mapper2);<br>&nbsp; <br>&nbsp;//assembly to synchronise interaction of points &amp; polydata<br>&nbsp;vtkSmartPointer&lt;vtkAssembly&gt; assembly =&nbsp;vtkSmartPointer&lt;vtkAssembly&gt;::New();<br>&nbsp;assembly-&gt;AddPart(points_actor);<br>&nbsp;assembly-&gt;AddPart(Actor2);<BR>&nbsp;// Visualize<br>&nbsp;vtkSmartPointer&lt;vtkRenderer&gt; renderer = vtkSmartPointer&lt;vtkRenderer&gt;::New();<br>&nbsp;vtkSmartPointer&lt;vtkRenderWindow&gt; renderWindow = vtkSmartPointer&lt;vtkRenderWindow&gt;::New();<br>&nbsp;renderWindow-&gt;AddRenderer(renderer);<br>&nbsp;<br>&nbsp;vtkSmartPointer&lt;vtkRenderWindowInteractor&gt; renderWindowInteractor =<br>&nbsp;&nbsp;vtkSmartPointer&lt;vtkRenderWindowInteractor&gt;::New();<br>&nbsp;renderWindowInteractor-&gt;SetRenderWindow(renderWindow);<br>&nbsp;<br>&nbsp;renderer-&gt;AddActor(assembly);<br>&nbsp;<br>&nbsp;renderWindow-&gt;Render();<br>&nbsp;<br>&nbsp;vtkSmartPointer&lt;InteractorStyle&gt; style = vtkSmartPointer&lt;InteractorStyle&gt;::New();<br>&nbsp;renderWindowInteractor-&gt;SetInteractorStyle( style );<BR>&nbsp;style-&gt;Data = points_poly;<br>&nbsp;<br>&nbsp;renderWindowInteractor-&gt;Start();<br>&nbsp;return EXIT_SUCCESS;<br>}<BR>                                               </div></body>
</html>