VTK(The Visualization Toolkit)加载stl模型

VTK系列文章目录

前言

在上一节中主要记录了vtk的编译
下面说说我的第一个VTK示例:使用VTK(The Visualization Toolkit)加载stl模型

一、创建工程

1.工程配置

1.使用vs2019新建一个新的空项目
2.配置头文件,说实话,这里是最麻烦的,因为vtk他的头文件和三方头文件都是分开放的,我只有把这些头文件夹一个一个的复制到工程中,不像有些库直接一个include就搞定了。目前用到的头文件模块就是:
1.Common
2.Filters
3.Interaction
4.IO
5.Rendering
6.Utilities
另外有个问题:官方下的vtk9.2.0版本源码中的头文件不全,需要编译vtk9.2.0源码后会生成一些头文件,估计跟CMakeList配置相关,可是CMakeList语法我又看不懂,请大佬指定一下哈。所有我把编译后生成的头文件命名为:build_include,

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
3.配置lib路径
在这里插入图片描述
配置lib附加依赖项
在这里插入图片描述
我这里偷懒了,一股脑的把vtk所有的lib都配置进来了,其实只用配置那些用到的lib

vtkCommonCore-9.2d.lib
vtkCommonSystem-9.2d.lib
vtksys-9.2d.lib
port.lib
vtkChartsCore-9.2d.lib
vtkCommonColor-9.2d.lib
vtkCommonComputationalGeometry-9.2d.lib
vtkCommonDataModel-9.2d.lib
vtkCommonExecutionModel-9.2d.lib
vtkCommonMath-9.2d.lib
vtkCommonMisc-9.2d.lib
vtkCommonTransforms-9.2d.lib
vtkDICOMParser-9.2d.lib
vtkDomainsChemistry-9.2d.lib
vtkDomainsChemistryOpenGL2-9.2d.lib
vtkdoubleconversion-9.2d.lib
vtkexodusII-9.2d.lib
vtkexpat-9.2d.lib
vtkFiltersAMR-9.2d.lib
vtkFiltersCore-9.2d.lib
vtkFiltersExtraction-9.2d.lib
vtkFiltersFlowPaths-9.2d.lib
vtkFiltersGeneral-9.2d.lib
vtkFiltersGeneric-9.2d.lib
vtkFiltersGeometry-9.2d.lib
vtkFiltersHybrid-9.2d.lib
vtkFiltersHyperTree-9.2d.lib
vtkFiltersImaging-9.2d.lib
vtkFiltersModeling-9.2d.lib
vtkFiltersParallel-9.2d.lib
vtkFiltersParallelImaging-9.2d.lib
vtkFiltersPoints-9.2d.lib
vtkFiltersProgrammable-9.2d.lib
vtkFiltersSelection-9.2d.lib
vtkFiltersSMP-9.2d.lib
vtkFiltersSources-9.2d.lib
vtkFiltersStatistics-9.2d.lib
vtkFiltersTexture-9.2d.lib
vtkFiltersTopology-9.2d.lib
vtkFiltersVerdict-9.2d.lib
vtkfreetype-9.2d.lib
vtkGeovisCore-9.2d.lib
vtkgl2ps-9.2d.lib
vtkglew-9.2d.lib
vtkhdf5-9.2d.lib
vtkhdf5_hl-9.2d.lib
vtkImagingColor-9.2d.lib
vtkImagingCore-9.2d.lib
vtkImagingFourier-9.2d.lib
vtkImagingGeneral-9.2d.lib
vtkImagingHybrid-9.2d.lib
vtkImagingMath-9.2d.lib
vtkImagingMorphological-9.2d.lib
vtkImagingSources-9.2d.lib
vtkImagingStatistics-9.2d.lib
vtkImagingStencil-9.2d.lib
vtkInfovisCore-9.2d.lib
vtkInfovisLayout-9.2d.lib
vtkInteractionImage-9.2d.lib
vtkInteractionStyle-9.2d.lib
vtkInteractionWidgets-9.2d.lib
vtkIOAMR-9.2d.lib
vtkIOAsynchronous-9.2d.lib
vtkIOCityGML-9.2d.lib
vtkIOCore-9.2d.lib
vtkIOEnSight-9.2d.lib
vtkIOExodus-9.2d.lib
vtkIOExport-9.2d.lib
vtkIOExportPDF-9.2d.lib
vtkIOGeometry-9.2d.lib
vtkIOImage-9.2d.lib
vtkIOImport-9.2d.lib
vtkIOInfovis-9.2d.lib
vtkIOLegacy-9.2d.lib
vtkIOLSDyna-9.2d.lib
vtkIOMINC-9.2d.lib
vtkIOMovie-9.2d.lib
vtkIONetCDF-9.2d.lib
vtkIOParallel-9.2d.lib
vtkIOParallelXML-9.2d.lib
vtkIOPLY-9.2d.lib
vtkIOSegY-9.2d.lib
vtkIOSQL-9.2d.lib
vtkIOTecplotTable-9.2d.lib
vtkIOVeraOut-9.2d.lib
vtkIOVideo-9.2d.lib
vtkIOXML-9.2d.lib
vtkIOXMLParser-9.2d.lib
vtkjpeg-9.2d.lib
vtkjsoncpp-9.2d.lib
vtklibharu-9.2d.lib
vtklibxml2-9.2d.lib
vtklz4-9.2d.lib
vtklzma-9.2d.lib
vtkmetaio-9.2d.lib
vtkNetCDF-9.2d.lib
vtkogg-9.2d.lib
vtkParallelCore-9.2d.lib
vtkpng-9.2d.lib
vtkpugixml-9.2d.lib
vtkRenderingAnnotation-9.2d.lib
vtkRenderingContext2D-9.2d.lib
vtkRenderingContextOpenGL2-9.2d.lib
vtkRenderingCore-9.2d.lib
vtkRenderingFreeType-9.2d.lib
vtkRenderingGL2PSOpenGL2-9.2d.lib
vtkRenderingImage-9.2d.lib
vtkRenderingLabel-9.2d.lib
vtkRenderingLOD-9.2d.lib
vtkRenderingOpenGL2-9.2d.lib
vtkRenderingVolume-9.2d.lib
vtkRenderingVolumeOpenGL2-9.2d.lib
vtksqlite-9.2d.lib
vtktheora-9.2d.lib
vtktiff-9.2d.lib
vtkverdict-9.2d.lib
vtkViewsContext2D-9.2d.lib
vtkViewsCore-9.2d.lib
vtkViewsInfovis-9.2d.lib
vtkzlib-9.2d.lib	
vtkIOExportGL2PS-9.2d.lib

在这里插入图片描述
4.配置dll库,放在exe同级目录下
在这里插入图片描述

2.编写代码


#include "vtkPolyDataMapper.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkSmartPointer.h"
#include "vtkVectorText.h"
#include "vtkAxesActor.h"
#include "vtkPlane.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkPlaneSource.h"
#include "vtkProperty.h"
#include "vtkCaptionActor2D.h"
#include "vtkSTLReader.h"
#include "vtkInteractorStyleTrackballCamera.h"


#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

void loadFileWhitSTL(vtkSmartPointer<vtkRenderer> renderer)
{
	/*const char* path = "/home/tiger/project/YDMS/YdMedicalSystem/NailSTL/NailType01/45mm/M4.5x45_11.65.STL";*/
	const char* path = "Williams F1_dwg.stl";

	vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
	reader->SetFileName(path);
	reader->Update();

	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(reader->GetOutputPort());

	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);
	renderer->AddActor(actor);
}

void createText(vtkSmartPointer<vtkRenderer> renderer)
{
	vtkSmartPointer<vtkVectorText> text = vtkSmartPointer<vtkVectorText>::New();
	text->SetText("21530311");
	text->Update();

	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(text->GetOutputPort());

	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);
	actor->SetPosition(5.0, 5.0, 30.0);
	actor->SetScale(10.0);
	actor->GetProperty()->SetPointSize(48);
	actor->GetProperty()->SetColor(1.0, 0.0, 0.0);
	renderer->AddActor(actor);
}

void createAxes(vtkSmartPointer<vtkRenderer> renderer)
{
	//轴
	vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New();
	axes->SetTotalLength(150.0, 100.0, 50.0);
	axes->SetShaftType(vtkAxesActor::CYLINDER_SHAFT);//设置轴类型圆柱形状
	axes->SetCylinderRadius(0.01);
	axes->SetConeRadius(0.2);
	axes->GetXAxisCaptionActor2D()->SetWidth(0.02);
	axes->GetYAxisCaptionActor2D()->SetWidth(0.04);
	axes->GetZAxisCaptionActor2D()->SetWidth(0.08);

	renderer->AddActor(axes);
}

//底板
void createGround(vtkSmartPointer<vtkRenderer> renderer)
{
	vtkSmartPointer<vtkPlaneSource> plane = vtkSmartPointer<vtkPlaneSource>::New();
	plane->SetXResolution(50);
	plane->SetYResolution(50);
	plane->SetCenter(0, 0, 0);
	plane->SetNormal(0, 0, 1);

	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(plane->GetOutputPort());
	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);
	actor->SetScale(300.0, 300.0, 1.0);
	actor->GetProperty()->SetRepresentationToWireframe();

	renderer->AddActor(actor);
}

int main(int, char* [])
{
	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(renderer);
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	renderWindowInteractor->SetInteractorStyle(style);

	loadFileWhitSTL(renderer);
	createText(renderer);
	createAxes(renderer);
	createGround(renderer);

	renderer->SetBackground(0.2, 0.2, 0.2);
	renderer->ResetCameraClippingRange();

	renderWindow->Render();
	renderWindowInteractor->Initialize();
	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}



运行效果

在这里插入图片描述

源码下载

源码下载地址

VTKVisualization Toolkit)的C++环境中,遍历STL模型体素信息可以按以下步骤实现: ### 1. 读取STL文件 使用`vtkSTLReader`来读取STL文件,将STL文件加载VTK的数据结构中。 ```cpp #include <vtkSmartPointer.h> #include <vtkSTLReader.h> #include <vtkPolyData.h> vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New(); reader->SetFileName("your_file.stl"); reader->Update(); vtkSmartPointer<vtkPolyData> polyData = reader->GetOutput(); ``` ### 2. 生成体素数据 使用`vtkImageData`来表示体素数据,可通过`vtkPolyDataToImageStencil`和`vtkImageStencil`将STL的多边形数据转换为体素数据。 ```cpp #include <vtkPolyDataToImageStencil.h> #include <vtkImageStencil.h> #include <vtkImageData.h> #include <vtkPointData.h> // 获取模型的边界 double bounds[6]; polyData->GetBounds(bounds); // 定义体素的间距 double spacing[3] = {0.1, 0.1, 0.1}; // 计算体素的尺寸 int dim[3]; for (int i = 0; i < 3; i++) { dim[i] = static_cast<int>((bounds[i * 2 + 1] - bounds[i * 2]) / spacing[i]); } // 创建vtkImageData对象 vtkSmartPointer<vtkImageData> whiteImage = vtkSmartPointer<vtkImageData>::New(); whiteImage->SetSpacing(spacing); whiteImage->SetDimensions(dim); whiteImage->SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1); whiteImage->SetOrigin(bounds[0], bounds[2], bounds[4]); whiteImage->AllocateScalars(VTK_UNSIGNED_CHAR, 1); // 填充白色图像 unsigned char inval = 255; unsigned char outval = 0; vtkIdType count = whiteImage->GetNumberOfPoints(); for (vtkIdType i = 0; i < count; ++i) { whiteImage->GetPointData()->GetScalars()->SetTuple1(i, inval); } // 将多边形数据转换为图像模板 vtkSmartPointer<vtkPolyDataToImageStencil> pol2stenc = vtkSmartPointer<vtkPolyDataToImageStencil>::New(); pol2stenc->SetInputData(polyData); pol2stenc->SetOutputOrigin(whiteImage->GetOrigin()); pol2stenc->SetOutputSpacing(whiteImage->GetSpacing()); pol2stenc->SetOutputWholeExtent(whiteImage->GetExtent()); pol2stenc->Update(); // 使用模板裁剪图像 vtkSmartPointer<vtkImageStencil> imgstenc = vtkSmartPointer<vtkImageStencil>::New(); imgstenc->SetInputData(whiteImage); imgstenc->SetStencilConnection(pol2stenc->GetOutputPort()); imgstenc->ReverseStencilOff(); imgstenc->SetBackgroundValue(outval); imgstenc->Update(); vtkSmartPointer<vtkImageData> voxelData = imgstenc->GetOutput(); ``` ### 3. 遍历体素信息 通过`vtkImageData`的`GetScalarPointer`方法获取体素数据的指针,然后遍历这些体素。 ```cpp // 获取体素数据的尺寸 int* dimensions = voxelData->GetDimensions(); // 获取体素数据的指针 unsigned char* scalarData = static_cast<unsigned char*>(voxelData->GetScalarPointer()); // 遍历体素 for (int z = 0; z < dimensions[2]; z++) { for (int y = 0; y < dimensions[1]; y++) { for (int x = 0; x < dimensions[0]; x++) { // 计算体素的索引 int index = x + dimensions[0] * (y + dimensions[1] * z); unsigned char value = scalarData[index]; // 输出体素的值 std::cout << "Voxel at (" << x << ", " << y << ", " << z << ") has value: " << static_cast<int>(value) << std::endl; } } } ``` ### 完整代码示例 ```cpp #include <vtkSmartPointer.h> #include <vtkSTLReader.h> #include <vtkPolyData.h> #include <vtkPolyDataToImageStencil.h> #include <vtkImageStencil.h> #include <vtkImageData.h> #include <vtkPointData.h> #include <iostream> int main() { vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New(); reader->SetFileName("your_file.stl"); reader->Update(); vtkSmartPointer<vtkPolyData> polyData = reader->GetOutput(); double bounds[6]; polyData->GetBounds(bounds); double spacing[3] = {0.1, 0.1, 0.1}; int dim[3]; for (int i = 0; i < 3; i++) { dim[i] = static_cast<int>((bounds[i * 2 + 1] - bounds[i * 2]) / spacing[i]); } vtkSmartPointer<vtkImageData> whiteImage = vtkSmartPointer<vtkImageData>::New(); whiteImage->SetSpacing(spacing); whiteImage->SetDimensions(dim); whiteImage->SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1); whiteImage->SetOrigin(bounds[0], bounds[2], bounds[4]); whiteImage->AllocateScalars(VTK_UNSIGNED_CHAR, 1); unsigned char inval = 255; unsigned char outval = 0; vtkIdType count = whiteImage->GetNumberOfPoints(); for (vtkIdType i = 0; i < count; ++i) { whiteImage->GetPointData()->GetScalars()->SetTuple1(i, inval); } vtkSmartPointer<vtkPolyDataToImageStencil> pol2stenc = vtkSmartPointer<vtkPolyDataToImageStencil>::New(); pol2stenc->SetInputData(polyData); pol2stenc->SetOutputOrigin(whiteImage->GetOrigin()); pol2stenc->SetOutputSpacing(whiteImage->GetSpacing()); pol2stenc->SetOutputWholeExtent(whiteImage->GetExtent()); pol2stenc->Update(); vtkSmartPointer<vtkImageStencil> imgstenc = vtkSmartPointer<vtkImageStencil>::New(); imgstenc->SetInputData(whiteImage); imgstenc->SetStencilConnection(pol2stenc->GetOutputPort()); imgstenc->ReverseStencilOff(); imgstenc->SetBackgroundValue(outval); imgstenc->Update(); vtkSmartPointer<vtkImageData> voxelData = imgstenc->GetOutput(); int* dimensions = voxelData->GetDimensions(); unsigned char* scalarData = static_cast<unsigned char*>(voxelData->GetScalarPointer()); for (int z = 0; z < dimensions[2]; z++) { for (int y = 0; y < dimensions[1]; y++) { for (int x = 0; x < dimensions[0]; x++) { int index = x + dimensions[0] * (y + dimensions[1] * z); unsigned char value = scalarData[index]; std::cout << "Voxel at (" << x << ", " << y << ", " << z << ") has value: " << static_cast<int>(value) << std::endl; } } } return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值