網格平滑vtkSmoothPolyDataFilter
網格平滑是一種調整數據集中點座標的技術。網格平滑的目的是提高網格的外觀和提高單元數據集的形狀。在平滑過程中,不會改變數據集的拓撲結構,只改變幾何結構。網格平滑的應用包括提高等值面的外觀,或者作爲移除表面噪聲的模型工具。通過應用網格平滑,模型的外觀能夠動態地提高。
拉普拉斯平滑是一種常用的平滑算法。VTK
中 的vtkSmoothPolyDataFilter
類實現了網格的拉普拉斯平滑算法,原理如下面公式:
其中:Xnew
表示新的座標位置,X
表示當前的座標位置。j
表示X
的鄰域點個數,Xi
表示第i
個鄰域點的座標位置。
vtkSmoothPolyDataFilter::SetNumberOfIterations()
控制平滑次數,次數越大平滑越厲害,即細節損失越多。該類中還有多個變量來控制平滑過程,利用這些變化在一定程度岸上可以控制細節的損失。BoundarySmoothing
控制是否對邊界點平滑。FeatureEdgeSmoothing
控制是否對特徵邊上的點的平滑。如果一條邊被兩個鄰近的多邊形公用,若這兩個多邊形法向量的夾角(特徵角)大於定義的閾值,則說明這邊爲一條特徵邊。雖然通過特徵邊平滑設置可以降低一部分細節損失,並不能完全避免,且隨着拉普拉斯平滑的不斷迭代,模型會逐漸向網格的中心收縮。所以vtkWindowedSincPolyData
是一個更好的選擇,該算法使用窗口Sinc
函數實現網格平滑,能夠最小程度地避免收縮。
demo
vtkSmartPointer<vtkSmoothPolyDataFilter>smooth=
vtkSmartPointer<vtkSmoothPolyDataFilter>::New();
smooth->AddInputConnection(otherFilter->GetOutputPort());
smooth->SetRelaxationFactor(0.01);
smooth->SetNumberOfIterations(10);
smooth->SetFeatureEdgeSmoothing(false);
smooth->SetBoundarySmoothing(false);
smooth->Update();