概述:本文主要介绍vtk中常用的几种Normal接口,如:vtkPolyDataNormals,vtkTriangleMeshPointNormals,vtkPCANormalEstimation,vtkNormalizeMatrixVectors,vtkImageNormalize等。本文持续更新,欢迎小伙伴一起维护
1. vtkPolyDataNormals
vtkPolyDataNormals可以计算多边形网格数据的点或Cell的方向(只能计算polygons和triangle,不能计算Line和Vertices)。
vtkPolyData* pd;
vtkSmartPointer<vtkPolyDataNormals> pdNormals =
vtkSmartPointer<vtkPolyDataNormals>::New();
pdNormals->SetInputData(pd);
pdNormals->ComputeCellNormalsOn();//ComputePointNormalsOn默认为on
pdNormals->Update();
vtkPointData* ptData = pdNormals->GetOutput()->GetPointData();
vtkDataArray* ptNormals = pdNormals->GetOutput()->GetPointData()->GetNormals();
//获取每个Cell中每个点的方向
for( int i = 0; i < ptNormals->GetNumberOfTuples(); ++i )
{
double value[3];
ptNormals->GetTuple( i, value );
printf( "Value: (%lf, %lf, %lf)\n", value[0], value[1], value[2] );
}
//获取每个Cell的方向
if( pdNormals->GetOutput()->GetCellData() && pdNormals->GetOutput()->GetCellData()->GetNormals() )
{
vtkDataArray* cellNormals = pdNormals->GetOutput()->GetCellData()->GetNormals();
cout << cellNormals->GetNumberOfTuples() << endl;
for( int i = 0; i < cellNormals->GetNumberOfTuples(); ++i )
{
double value[3];
cellNormals->GetTuple( i, value );
printf( "Value: (%lf, %lf, %lf)\n", value[0], value[1], value[2] );
}
}
2. vtkTriangleMeshPointNormals
与vtkPolyDataNormals一样可以计算Point和Cell的方向,是vtkPolyDataNormals的加速版本。
两者对比
检查单元格方向的一致性并调整 | 分割三角形网格 | 高性能渲染 | |
vtkPolyDataNormals | √ | √ | × |
vtkTriangleMeshPointNormals | × | × | √ |