vtkSmartPointer<vtkPolyData> 常用的函数方法
vtkSmartPointer 常用的函数方法
在使用 VTK(Visualization Toolkit)进行三维可视化开发时,vtkPolyData
是最为核心的数据结构之一。它用于存储几何(点、线、面)及其拓扑关系,并支持附加标量场、向量场、法线、纹理坐标等属性。通常,我们使用 vtkSmartPointer<vtkPolyData>
来管理其生命周期。
本文将系统地整理和介绍 vtkPolyData
的常用方法,帮助你更高效地使用这类数据结构完成建模、处理和渲染任务。
🧱 什么是 vtkPolyData?
vtkPolyData
是 VTK 中专用于表示多边形网格的类,支持存储:
- 点(Points)
- 线段(Lines)
- 多边形(Polygons)
- 三角形带(Triangle Strips)
- 属性(Scalars、Normals、Vectors、Texture Coordinates)
🔹 1. 数据结构构建相关方法
▶ 设置几何点集
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
points->InsertNextPoint(x, y, z);
polyData->SetPoints(points);
▶ 添加多边形或线段单元
vtkSmartPointer<vtkCellArray> polys = vtkSmartPointer<vtkCellArray>::New();
vtkIdType ids[3] = {0, 1, 2}; // 三角形
polys->InsertNextCell(3, ids);
polyData->SetPolys(polys);
其他类似方法:
SetVerts(vtkCellArray*)
:设置点单元SetLines(vtkCellArray*)
:设置线段SetStrips(vtkCellArray*)
:设置三角带
🔹 2. 数据访问与查询
▶ 获取点和单元数量
int numPoints = polyData->GetNumberOfPoints();
int numCells = polyData->GetNumberOfCells();
▶ 获取指定点或单元
double p[3];
polyData->GetPoint(0, p); // 获取第一个点坐标vtkCell* cell = polyData->GetCell(0); // 获取第一个单元
▶ 获取边界框
double bounds[6];
polyData->GetBounds(bounds); // bounds: [xmin, xmax, ymin, ymax, zmin, zmax]
▶ 获取中心点
double center[3];
polyData->GetCenter(center);
🔹 3. 附加属性(点属性、法线、标量等)
▶ 添加标量数据(如温度、标签)
vtkSmartPointer<vtkFloatArray> scalars = vtkSmartPointer<vtkFloatArray>::New();
scalars->SetName("Temperature");
scalars->InsertNextValue(36.5);
scalars->InsertNextValue(37.1);
polyData->GetPointData()->SetScalars(scalars);
▶ 添加法向量
vtkSmartPointer<vtkFloatArray> normals = vtkSmartPointer<vtkFloatArray>::New();
normals->SetName("Normals");
normals->SetNumberOfComponents(3);
normals->InsertNextTuple3(0, 0, 1); // Z方向法线
polyData->GetPointData()->SetNormals(normals);
▶ 获取点或单元的属性
vtkDataArray* scalarArray = polyData->GetPointData()->GetScalars();
double val = scalarArray->GetComponent(0, 0); // 第一个点的标量值
🔹 4. 拷贝与更新
▶ 深拷贝 / 浅拷贝
vtkSmartPointer<vtkPolyData> copy = vtkSmartPointer<vtkPolyData>::New();
copy->DeepCopy(polyData); // 完全复制数据
copy->ShallowCopy(polyData); // 引用共享数据
▶ 通知数据已修改(管线更新)
polyData->Modified();
🔹 5. 配合 Filter 的常用处理操作
✅ 法线计算
vtkSmartPointer<vtkPolyDataNormals> normalsFilter = vtkSmartPointer<vtkPolyDataNormals>::New();
normalsFilter->SetInputData(polyData);
normalsFilter->ComputePointNormalsOn();
normalsFilter->Update();
vtkPolyData* withNormals = normalsFilter->GetOutput();
✅ 简化模型
vtkSmartPointer<vtkDecimatePro> decimate = vtkSmartPointer<vtkDecimatePro>::New();
decimate->SetInputData(polyData);
decimate->SetTargetReduction(0.5); // 保留 50% 面片
decimate->Update();
✅ 清理重复点
vtkSmartPointer<vtkCleanPolyData> clean = vtkSmartPointer<vtkCleanPolyData>::New();
clean->SetInputData(polyData);
clean->Update();
✅ 特征边提取
vtkSmartPointer<vtkFeatureEdges> edges = vtkSmartPointer<vtkFeatureEdges>::New();
edges->SetInputData(polyData);
edges->BoundaryEdgesOn();
edges->FeatureEdgesOn();
edges->Update();
✅ 总结:常用方法速查表
功能 | 方法 / 类 |
---|---|
设置点 | SetPoints() |
设置面 | SetPolys() |
设置线 | SetLines() |
获取点/单元 | GetPoint() , GetCell() |
添加属性 | GetPointData()->SetScalars() , SetNormals() |
法线生成 | vtkPolyDataNormals |
网格简化 | vtkDecimatePro |
清理重复点 | vtkCleanPolyData |
深拷贝 | DeepCopy() |
边界提取 | vtkFeatureEdges |
📝 结语
vtkPolyData
是进行三维建模和可视化的基础类。掌握其数据结构、属性系统与常见 Filter 的搭配使用,将极大提升你在 VTK 中构建几何图形和处理模型数据的能力。希望本文对你理解和使用 vtkSmartPointer<vtkPolyData>
提供了全面而实用的参考。
如果你有某类实际项目场景(如医学建模、工业点云处理等),欢迎留言交流,我们可以探讨更高级的使用模式和优化技巧。