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