这个专栏是用于记录我在学习VTK过程中的一些心得体会。参考的资料主要有以下三个:
1. 张晓东 罗火灵《VTK图形图像开发进阶》
2. https://examples.vtk.org/site/
3. 沈子恒 《VTK 三维数据渲染进阶》
遇到的一个大问题就是由于版本更新,这些资料中很多代码无法正常运行,需要进行一定的修改,所以这个专栏会记录下来我修改后的程序代码,以便于我之后温习。也希望能给和我有同样困扰的小伙伴们一些帮助。
我使用的版本:VTK9 + VS2022
VTK上选取点、选取区域这两个例子我主要是参考了官网的程序代码examples.vtk.org/site/Cxx/Picking/CellPicking/ 。
这个在我正在做的医学图像项目VS2022联合Qt5开发学习8(QT5.12.3联合VTK7在VS2022上开发医学图像项目3——医学图像可视化)-CSDN博客上有用到,所以在这里记录一下。
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkActor.h>
#include <vtkCellPicker.h>
#include <vtkDataSetMapper.h>
#include <vtkExtractSelection.h>
#include <vtkIdTypeArray.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPlaneSource.h>
#include <vtkPoints.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkRendererCollection.h>
#include <vtkSelection.h>
#include <vtkSelectionNode.h>
#include <vtkSmartPointer.h>
#include <vtkTriangleFilter.h>
#include <vtkUnstructuredGrid.h>namespace {// Catch mouse events.class MouseInteractorStyle : public vtkInteractorStyleTrackballCamera{public:static MouseInteractorStyle* New();MouseInteractorStyle(){selectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();selectedActor = vtkSmartPointer<vtkActor>::New();}virtual void OnLeftButtonDown() override{vtkNew<vtkNamedColors> colors;// Get the location of the click (in window coordinates).int* pos = this->GetInteractor()->GetEventPosition();vtkNew<vtkCellPicker> picker;picker->SetTolerance(0.0005);// Pick from this location.picker->Pick(pos[0], pos[1], 0, this->GetDefaultRenderer());double* worldPosition = picker->GetPickPosition();std::cout << "Cell id is: " << picker->GetCellId() << std::endl;if (picker->GetCellId() != -1){std::cout << "Pick position is: (" << worldPosition[0] << ", "<< worldPosition[1] << ", " << worldPosition[2] << ")" << endl;vtkNew<vtkIdTypeArray> ids;ids->SetNumberOfComponents(1);ids->InsertNextValue(picker->GetCellId());vtkNew<vtkSelectionNode> selectionNode;selectionNode->SetFieldType(vtkSelectionNode::CELL);selectionNode->SetContentType(vtkSelectionNode::INDICES);selectionNode->SetSelectionList(ids);vtkNew<vtkSelection> selection;selection->AddNode(selectionNode);vtkNew<vtkExtractSelection> extractSelection;extractSelection->SetInputData(0, this->Data);extractSelection->SetInputData(1, selection);extractSelection->Update();// In selectionvtkNew<vtkUnstructuredGrid> selected;selected->ShallowCopy(extractSelection->GetOutput());std::cout << "Number of points in the selection: "<< selected->GetNumberOfPoints() << std::endl;std::cout << "Number of cells in the selection : "<< selected->GetNumberOfCells() << std::endl;selectedMapper->SetInputData(selected);selectedActor->SetMapper(selectedMapper);selectedActor->GetProperty()->EdgeVisibilityOn();selectedActor->GetProperty()->SetColor(colors->GetColor3d("Tomato").GetData());selectedActor->GetProperty()->SetLineWidth(3);this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);}// Forward events.vtkInteractorStyleTrackballCamera::OnLeftButtonDown();}vtkSmartPointer<vtkPolyData> Data;vtkSmartPointer<vtkDataSetMapper> selectedMapper;vtkSmartPointer<vtkActor> selectedActor;};vtkStandardNewMacro(MouseInteractorStyle);} // namespaceint main(int, char* [])
{vtkNew<vtkNamedColors> colors;vtkNew<vtkPlaneSource> planeSource;planeSource->Update();vtkNew<vtkTriangleFilter> triangleFilter;triangleFilter->SetInputConnection(planeSource->GetOutputPort());triangleFilter->Update();vtkNew<vtkPolyDataMapper> mapper;mapper->SetInputConnection(triangleFilter->GetOutputPort());vtkNew<vtkActor> actor;actor->GetProperty()->SetColor(colors->GetColor3d("SeaGreen").GetData());actor->SetMapper(mapper);vtkNew<vtkRenderer> renderer;vtkNew<vtkRenderWindow> renderWindow;renderWindow->AddRenderer(renderer);renderWindow->SetWindowName("CellPicking");vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;renderWindowInteractor->SetRenderWindow(renderWindow);renderWindowInteractor->Initialize();// Set the custom stype to use for interaction.vtkNew<MouseInteractorStyle> style;style->SetDefaultRenderer(renderer);style->Data = triangleFilter->GetOutput();renderWindowInteractor->SetInteractorStyle(style);renderer->AddActor(actor);renderer->ResetCamera();renderer->SetBackground(colors->GetColor3d("PaleTurquoise").GetData());renderWindow->Render();renderWindowInteractor->Start();return EXIT_SUCCESS;
}
运行结果
VTK上选取点
因为我的医学图像项目VS2022联合Qt5开发学习8(QT5.12.3联合VTK7在VS2022上开发医学图像项目3——医学图像可视化)-CSDN博客用的是VTK7,所以我又修改了一下代码,让它能在VTK7下正常运行。修改的主要地方是用 .GetPointer()
方法获取指向对象的指针,并将其传递给需要原始指针的函数或方法。
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkActor.h>
#include <vtkCellPicker.h>
#include <vtkDataSetMapper.h>
#include <vtkExtractSelection.h>
#include <vtkIdTypeArray.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPlaneSource.h>
#include <vtkPoints.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkRendererCollection.h>
#include <vtkSelection.h>
#include <vtkSelectionNode.h>
#include <vtkSmartPointer.h>
#include <vtkTriangleFilter.h>
#include <vtkUnstructuredGrid.h>namespace {// Catch mouse events.class MouseInteractorStyle : public vtkInteractorStyleTrackballCamera{public:static MouseInteractorStyle* New();MouseInteractorStyle(){selectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();selectedActor = vtkSmartPointer<vtkActor>::New();}virtual void OnLeftButtonDown() override{vtkNew<vtkNamedColors> colors;// Get the location of the click (in window coordinates).int* pos = this->GetInteractor()->GetEventPosition();vtkNew<vtkCellPicker> picker;picker->SetTolerance(0.0005);// Pick from this location.picker->Pick(pos[0], pos[1], 0, this->GetDefaultRenderer());double* worldPosition = picker->GetPickPosition();std::cout << "Cell id is: " << picker->GetCellId() << std::endl;if (picker->GetCellId() != -1){std::cout << "Pick position is: (" << worldPosition[0] << ", "<< worldPosition[1] << ", " << worldPosition[2] << ")" << endl;vtkNew<vtkIdTypeArray> ids;ids->SetNumberOfComponents(1);ids->InsertNextValue(picker->GetCellId());vtkNew<vtkSelectionNode> selectionNode;selectionNode->SetFieldType(vtkSelectionNode::CELL);selectionNode->SetContentType(vtkSelectionNode::INDICES);selectionNode->SetSelectionList(ids.GetPointer()); // 使用 .GetPointer() 获取指针vtkNew<vtkSelection> selection;selection->AddNode(selectionNode.GetPointer());vtkNew<vtkExtractSelection> extractSelection;extractSelection->SetInputData(0, this->Data.GetPointer());extractSelection->SetInputData(1, selection.GetPointer());extractSelection->Update();// In selectionvtkNew<vtkUnstructuredGrid> selected;selected->ShallowCopy(extractSelection->GetOutput());std::cout << "Number of points in the selection: "<< selected->GetNumberOfPoints() << std::endl;std::cout << "Number of cells in the selection : "<< selected->GetNumberOfCells() << std::endl;selectedMapper->SetInputData(selected.GetPointer());selectedActor->SetMapper(selectedMapper);selectedActor->GetProperty()->EdgeVisibilityOn();selectedActor->GetProperty()->SetColor(colors->GetColor3d("Tomato").GetData());selectedActor->GetProperty()->SetLineWidth(3);this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);}// Forward events.vtkInteractorStyleTrackballCamera::OnLeftButtonDown();}vtkSmartPointer<vtkPolyData> Data;vtkSmartPointer<vtkDataSetMapper> selectedMapper;vtkSmartPointer<vtkActor> selectedActor;};vtkStandardNewMacro(MouseInteractorStyle);} // namespaceint main(int, char* [])
{vtkNew<vtkNamedColors> colors;vtkNew<vtkPlaneSource> planeSource;planeSource->Update();vtkNew<vtkTriangleFilter> triangleFilter;triangleFilter->SetInputConnection(planeSource->GetOutputPort());triangleFilter->Update();vtkNew<vtkPolyDataMapper> mapper;mapper->SetInputConnection(triangleFilter->GetOutputPort());vtkMapper* mapperRawPtr = mapper.GetPointer(); // 获取指针vtkNew<vtkActor> actor;vtkProp* actorRawPtr = actor.GetPointer();actor->GetProperty()->SetColor(colors->GetColor3d("SeaGreen").GetData());actor->SetMapper(mapperRawPtr);vtkNew<vtkRenderer> renderer;vtkRenderer* rendererRawPtr = renderer.GetPointer(); // 获取指针vtkNew<vtkRenderWindow> renderWindow;renderWindow->AddRenderer(rendererRawPtr);renderWindow->SetWindowName("CellPicking");vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;vtkRenderWindow* renderWindowRawPtr = renderWindow.GetPointer();renderWindowInteractor->SetRenderWindow(renderWindowRawPtr);renderWindowInteractor->Initialize();// Set the custom stype to use for interaction.vtkNew<MouseInteractorStyle> style;vtkInteractorObserver* styleRawPtr = style.GetPointer();style->SetDefaultRenderer(rendererRawPtr);style->Data = triangleFilter->GetOutput();renderWindowInteractor->SetInteractorStyle(styleRawPtr);renderer->AddActor(actorRawPtr);renderer->ResetCamera();renderer->SetBackground(colors->GetColor3d("PaleTurquoise").GetData());renderWindow->Render();renderWindowInteractor->Start();return EXIT_SUCCESS;
}