#include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkRenderer.h> #include <vtkSphereSource.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkSmartPointer.h> #include <vtkPointPicker.h> #include <vtkCamera.h> #include <vtkInteractorStyleTrackballCamera.h> #include <vtkNamedColors.h> #include <vtkObjectFactory.h> #include<vtkLine.h> #include<vtkProperty.h> #include<vtkPolyLine.h> #include<vtkUnstructuredGrid.h> #include<vtkDataSetMapper.h> #include<vtkLineSource.h> #include<vtkRendererCollection.h> #include<vtkCellPicker.h> #include "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INIT(vtkInteractionStyle); // Define interaction style vtkSmartPointer<vtkRenderer> renderer; double point1[3]{ 0 }; double point2[3]{ 0 }; double WorldPoint[3]{ 0 }; double WorldPoint1[3]{ 0 }; int *clickPos; int *clickPos1; int *movePos; vtkSmartPointer<vtkLineSource> lineSource = vtkSmartPointer<vtkLineSource>::New(); vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); vtkSmartPointer<vtkActor> actor1 = vtkSmartPointer<vtkActor>::New(); class customMouseInteractorStyle : public vtkInteractorStyleTrackballCamera { public: static customMouseInteractorStyle* New(); vtkTypeMacro(customMouseInteractorStyle, vtkInteractorStyleTrackballCamera); virtual void OnLeftButtonDown() { std::cout << "Pressed left mouse button." << std::endl; // Forward events // vtkInteractorStyleTrackballCamera::OnLeftButtonDown(); // int* clickPos = this->GetInteractor()->GetEventPosition(); clickPos = this->GetInteractor()->GetEventPosition(); point1[0] = clickPos[0]; point1[1] = clickPos[1]; renderer->SetDisplayPoint(point1[0], point1[1], 0); renderer->DisplayToWorld(); WorldPoint[0] = (renderer->GetWorldPoint())[0]; WorldPoint[1] = (renderer->GetWorldPoint())[1]; WorldPoint[2] = (renderer->GetWorldPoint())[2]; // double* worldPosition = picker->GetPickPosition(); // std::cout << worldPosition[0] << "\t" << worldPosition[1] << std::endl; // std::cout << WorldPoint[0]<< std::endl << WorldPoint[1]<< std::endl; } virtual void OnLeftButtonUp() { std::cout << "Pressed left mouse up." << std::endl; vtkIdType pts[2]{ 0,1 }; // Forward events // vtkInteractorStyleTrackballCamera::OnLeftButtonDown(); // int* clickPos = this->GetInteractor()->GetEventPosition(); clickPos1 = this->GetInteractor()->GetEventPosition(); point2[0] = clickPos1[0]; point2[1] = clickPos1[1]; // std::cout << clickPos[0] << std::endl << clickPos[1] << std::endl << std::endl ; std::cout << point1[0] << std::endl << point1[1] << std::endl; std::cout << clickPos1[0] << std::endl << clickPos1[1] << std::endl; renderer->SetDisplayPoint(point2[0], point2[1], 0); renderer->DisplayToWorld(); WorldPoint1[0] = (renderer->GetWorldPoint())[0]; WorldPoint1[1] = (renderer->GetWorldPoint())[1]; WorldPoint1[2] = (renderer->GetWorldPoint())[2]; lineSource->SetPoint1(WorldPoint); lineSource->SetPoint2(WorldPoint1); mapper->SetInputConnection(lineSource->GetOutputPort()); actor1->SetMapper(mapper); actor1->GetProperty()->SetColor(1.0, 0.0, 0.0); // actor1->SetOrigin(0, 0,0); this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(actor1); renderer->GetRenderWindow()->GetInteractor()->Initialize(); renderer->GetRenderWindow()->GetInteractor()->Render(); } virtual void OnMiddleButtonDown() { std::cout << "Pressed middle mouse button." << std::endl; // Forward events vtkInteractorStyleTrackballCamera::OnMiddleButtonDown(); } virtual void OnRightButtonDown() { std::cout << "Pressed right mouse button." << std::endl; // Forward events vtkInteractorStyleTrackballCamera::OnRightButtonDown(); } virtual void OnMouseMove() { if (clickPos == nullptr) return; vtkIdType pts[2]{ 0,1 }; // Forward events // vtkInteractorStyleTrackballCamera::OnMouseMove(); movePos = this->GetInteractor()->GetEventPosition(); point2[0] = movePos[0]; point2[1] = movePos[1]; // std::cout << clickPos[0] << std::endl << clickPos[1] << std::endl << std::endl ; std::cout << point1[0] << std::endl << point1[1] << std::endl; std::cout << movePos[0] << std::endl << movePos[1] << std::endl; // renderer->SetDisplayPoint(point2[0], point2[1], 0); renderer->DisplayToWorld(); WorldPoint1[0] = (renderer->GetWorldPoint())[0]; WorldPoint1[1] = (renderer->GetWorldPoint())[1]; WorldPoint1[2] = (renderer->GetWorldPoint())[2]; lineSource->SetPoint1(WorldPoint); lineSource->SetPoint2(WorldPoint1); mapper->SetInputConnection(lineSource->GetOutputPort()); actor1->SetMapper(mapper); actor1->GetProperty()->SetColor(1.0, 0.0, 0.0); // actor1->SetOrigin(0, 0,0); this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(actor1); renderer->GetRenderWindow()->GetInteractor()->Initialize(); renderer->GetRenderWindow()->GetInteractor()->Render(); } }; vtkStandardNewMacro(customMouseInteractorStyle); int main(int, char *[]) { vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New(); sphereSource->SetCenter(0.0, 0.0, 0.0); sphereSource->SetRadius(5.0); sphereSource->Update(); vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(sphereSource->GetOutputPort()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New(); renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->SetBackground(colors->GetColor3d("Slate_grey").GetData()); renderer->AddActor(actor); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); renderWindowInteractor->SetRenderWindow(renderWindow); vtkSmartPointer<customMouseInteractorStyle> style = vtkSmartPointer<customMouseInteractorStyle>::New(); renderWindowInteractor->SetInteractorStyle(style); renderWindowInteractor->Initialize(); renderWindowInteractor->Start(); return EXIT_SUCCESS; }
#include <vtkSmartPointer.h> #include <vtkObjectFactory.h> #include <vtkSphereSource.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> #include <vtkCommand.h> #include <vtkWorldPointPicker.h> #include <vtkProperty.h> #include <vtkRendererCollection.h> #include <vtkLineSource.h> #include <vtkInteractorStyle.h> class DrawLineCommand : public vtkCommand { public: static DrawLineCommand *New() { return new DrawLineCommand; } void DrawLineCommand::SetInteractor(vtkRenderWindowInteractor* interactor) { m_interactor = interactor; } virtual void Execute(vtkObject*, unsigned long eventId, void*) { vtkSmartPointer<vtkWorldPointPicker>pointPicker = vtkSmartPointer<vtkWorldPointPicker>::New(); double pickPos[3] = { 0,0,0 }; m_interactor->SetPicker(pointPicker); switch (eventId) { case vtkCommand::RightButtonPressEvent: MouseMotion = 1; m_interactor->GetPicker()->Pick(m_interactor->GetEventPosition()[0], m_interactor->GetEventPosition()[1], 0, m_interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()); m_interactor->GetPicker()->GetPickPosition(pickPos); pt1[0] = pickPos[0]; pt1[1] = pickPos[1]; pt1[2] = pickPos[2]; break; case vtkCommand::RightButtonReleaseEvent: MouseMotion = 0; break; case vtkCommand::MouseMoveEvent: if (MouseMotion) { m_interactor->GetPicker()->Pick(m_interactor->GetEventPosition()[0], m_interactor->GetEventPosition()[1], 0, m_interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()); m_interactor->GetPicker()->GetPickPosition(pickPos); pt2[0] = pickPos[0]; pt2[1] = pickPos[1]; pt2[2] = pickPos[2]; line->SetPoint1(pt1); line->SetPoint2(pt2); line->Update(); mapper->SetInputData(line->GetOutput()); mapper->Update(); actor->SetMapper(mapper); actor->GetProperty()->SetColor(pt2); m_interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(actor); m_interactor->GetRenderWindow()->Render(); } break; } } vtkRenderWindowInteractor* m_interactor; vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); vtkSmartPointer<vtkLineSource> line = vtkSmartPointer<vtkLineSource>::New(); vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); double pt1[3] = { 0,0,0 }, pt2[3] = { 0,0,0 }; int MouseMotion = 0; }; int main(int, char *[]) { // Create a sphere vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New(); sphereSource->Update(); // Create a mapper and actor vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(sphereSource->GetOutputPort()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // Create a renderer, render window, and interactor vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); renderWindowInteractor->SetRenderWindow(renderWindow); // Initialize must be called prior to creating timer events. renderWindowInteractor->Initialize(); renderWindowInteractor->CreateRepeatingTimer(500); vtkSmartPointer<vtkInteractorStyle> style = vtkSmartPointer<vtkInteractorStyle>::New(); renderWindowInteractor->SetInteractorStyle(style); vtkSmartPointer<DrawLineCommand> drawLineCallBack = vtkSmartPointer<DrawLineCommand>::New(); drawLineCallBack->SetInteractor(renderWindowInteractor); renderWindowInteractor->AddObserver(vtkCommand::RightButtonPressEvent, drawLineCallBack); renderWindowInteractor->AddObserver(vtkCommand::MouseMoveEvent, drawLineCallBack); renderWindowInteractor->AddObserver(vtkCommand::RightButtonReleaseEvent, drawLineCallBack); // Add the actor to the scene renderer->AddActor(actor); renderer->SetBackground(1, 1, 1); // Background color white // Render and interact renderWindow->Render(); renderWindowInteractor->Start(); return EXIT_SUCCESS; }
文章来源: vtk随鼠标运动实时画支线