vtk操作STL模型系列
前言:STL三维模型文件是被广泛使用的三维模型文件格式,对其的各种操作自然就有很多实用价值
一、读取STL
使用vtkStlReader读取,再用渲染管线渲染出来。
vtkSmartPointer<vtkSTLReader> reader=vtkSmartPointer<vtkSTLReader>::New();
reader->SetFileName(filePath.c_str());
reader->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper=vtksmartPointer<vtkPolyDataMapper>::New();
mapper->SetinputConnection(reader->GetoutputPort());
二、将STL模型放大,缩小,移动
首先设定一种变换(放大&放缩&移动),再将设定好的变换传递给变换过滤器,再用mapper渲染
// 定义变换
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
transform->Translate(400.0,0.0,0.0);//移动到(400,0,0)的位置
transform->Scale(1.0, 0.5, 2.0);//将stl模型沿着x,y,z轴变形(a,b,c)倍
//定义变换过滤器
vtkSmartPointer<vtkTransformPolyDataFilter> transfilter = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
transfilter->SetInputConnection(reader->GetOutputPort());//得到模型数据
transfilter->SetTransform(transform);//设定变换
transfilter->Update();//对模型实施变换
//定义映射器
vtkSmartPointer<vtkPolyDataMapper> mapper= vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(transfilter->GetOutputPort());//再次回归到渲染流程
三、STL网格三角面片数量降低
stl模型由顶点和三角面片构成,若减少顶点数量,则三角面片也会减少,从而丢失细节,变得粗糙,实现网格粗糙化
//读取
vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
reader->SetFileName(filepath.c_str());
reader->Update();
vtkSmartPointer<vtkPolyData> orig = reader->GetOutput();
//网格三角面片数量降低
vtkSmartPointer<vtkDecimatePro> decimate = vtkSmartPointer<vtkDecimatePro>::New();
decimate->SetInputData(orig);
decimate->SetTargetReduction(0.7);//去掉百分之70的三角面片
decimate->Update();
vtkSmartPointer<vtkPolyData> decimated = decimate->GetOutput();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(decimated);