VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.模型細化
vtk中實現網格細化的累有vtkLinearSubdivisionFilter、vtkLoopsubdivisionFilter、vtkButterflySubdivisionFilter。這三個類都繼承自vtkInterpolatingSubdivisionFilter。具體的類的繼承關系圖如下圖所示:vtkInterpolatingSunvisionFilter內部提供了SetNumberOfSubvisions()函數來設置細化的次數,其中每次細化后模型的三角面片的個數將是細化前的四倍。因此,在對網格模型進行n次細化后,該模型的面片個數將是原始模型面片數目的4*n倍。
1.1 vtkLinearSubdivisionFilter
該類實現了一種線性細分算法,每次細分將每個三角形面片生成四個新的面片,該算法比較簡單,速度快,但是細分后不能產生光滑的模型。1.2 vtkLoopSubdivisionFilter
該類實現的是Loop細分算法,每次細分會將一個三角面片生成4個三角面片,具體算法思想可以參考文獻[1];該方法可以生成光滑的連續曲面,應用比較廣泛。1.3 vtkButterflySubdivisionFilter
該類實現了蝶形細分算法,具體的算法思想可以參考文獻[2].2.網格模型細化實驗
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h> #include <vtkPolyDataReader.h> #include <vtkPolyData.h> #include <vtkLinearSubdivisionFilter.h> #include <vtkLoopSubdivisionFilter.h> #include <vtkButterflySubdivisionFilter.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkCamera.h> #include <vtkRenderWindowInteractor.h>int main() {//讀數據vtkSmartPointer<vtkPolyDataReader> reader =vtkSmartPointer<vtkPolyDataReader>::New();reader->SetFileName("fran_cut.vtk");reader->Update();vtkSmartPointer<vtkPolyData> orig = reader->GetOutput();std::cout << "original" << "-----------------------" << std::endl;std::cout << "模型點數為: " << orig->GetNumberOfPoints() << std::endl;std::cout << "模型面數為: " << orig->GetNumberOfPolys() << std::endl;//線性網格細分濾波器vtkSmartPointer<vtkLinearSubdivisionFilter> linear =vtkSmartPointer<vtkLinearSubdivisionFilter>::New();linear->SetInputData(orig);linear->SetNumberOfSubdivisions(4);linear->Update();vtkSmartPointer<vtkPolyData> linearInfo = linear->GetOutput();std::cout << "linear" << "-----------------------" << std::endl;std::cout << "模型點數為: " << linearInfo->GetNumberOfPoints() << std::endl;std::cout << "模型面數為: " << linearInfo->GetNumberOfPolys() << std::endl;//Loop網格細分濾波器vtkSmartPointer<vtkLoopSubdivisionFilter> loop =vtkSmartPointer<vtkLoopSubdivisionFilter>::New();loop->SetInputData(orig);loop->SetNumberOfSubdivisions(4);loop->Update();vtkSmartPointer<vtkPolyData> loopInfo = loop->GetOutput();std::cout << "loop" << "-----------------------" << std::endl;std::cout << "模型點數為: " << loopInfo->GetNumberOfPoints() << std::endl;std::cout << "模型面數為: " << loopInfo->GetNumberOfPolys() << std::endl;//butterfly網格細分濾波器vtkSmartPointer<vtkButterflySubdivisionFilter> butterfly =vtkSmartPointer<vtkButterflySubdivisionFilter>::New();butterfly->SetInputData(orig);butterfly->SetNumberOfSubdivisions(4);butterfly->Update();vtkSmartPointer<vtkPolyData> butterflyInfo = butterfly->GetOutput();std::cout << "butterfly" << "-----------------------" << std::endl;std::cout << "模型點數為: " << butterflyInfo->GetNumberOfPoints() << std::endl;std::cout << "模型面數為: " << butterflyInfo->GetNumberOfPolys() << std::endl;vtkSmartPointer<vtkPolyDataMapper> origMapper =vtkSmartPointer<vtkPolyDataMapper>::New();origMapper->SetInputData(orig);vtkSmartPointer<vtkActor> origActor =vtkSmartPointer<vtkActor>::New();origActor->SetMapper(origMapper);vtkSmartPointer<vtkPolyDataMapper> linearMapper =vtkSmartPointer<vtkPolyDataMapper>::New();linearMapper->SetInputData(linear->GetOutput());vtkSmartPointer<vtkActor> linearActor =vtkSmartPointer<vtkActor>::New();linearActor->SetMapper(linearMapper);vtkSmartPointer<vtkPolyDataMapper> loopMapper =vtkSmartPointer<vtkPolyDataMapper>::New();loopMapper->SetInputData(loop->GetOutput());vtkSmartPointer<vtkActor> loopActor =vtkSmartPointer<vtkActor>::New();loopActor->SetMapper(loopMapper);vtkSmartPointer<vtkPolyDataMapper> butterflyMapper =vtkSmartPointer<vtkPolyDataMapper>::New();butterflyMapper->SetInputData(butterfly->GetOutput());vtkSmartPointer<vtkActor> butterflyActor =vtkSmartPointer<vtkActor>::New();butterflyActor->SetMapper(butterflyMapper);//double ltView[4] = { 0, 0, 0.5, 0.5 };double rtView[4] = { 0.5, 0, 1, 0.5 };double lbView[4] = { 0, 0.5, 0.5, 1 };double rbView[4] = { 0.5, 0.5, 1, 1 };vtkSmartPointer<vtkRenderer> origRender =vtkSmartPointer<vtkRenderer>::New();origRender->SetViewport(ltView);origRender->AddActor(origActor);origRender->SetBackground(1, 0, 0);vtkSmartPointer<vtkRenderer> linearRender =vtkSmartPointer<vtkRenderer>::New();linearRender->SetViewport(rtView);linearRender->AddActor(linearActor);linearRender->SetBackground(0, 1, 0);vtkSmartPointer<vtkRenderer> loopRender =vtkSmartPointer<vtkRenderer>::New();loopRender->SetViewport(lbView);loopRender->AddActor(loopActor);loopRender->SetBackground(0, 0, 1);vtkSmartPointer<vtkRenderer> butterflyRender =vtkSmartPointer<vtkRenderer>::New();butterflyRender->SetViewport(rbView);butterflyRender->AddActor(butterflyActor);butterflyRender->SetBackground(0, 0, 0);//vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(origRender);rw->AddRenderer(linearRender);rw->AddRenderer(loopRender);rw->AddRenderer(butterflyRender);rw->SetSize(640, 640);rw->SetWindowName("PolyData Subdivision");origRender->GetActiveCamera()->SetPosition(0, -1, 0);origRender->GetActiveCamera()->SetFocalPoint(0, 0, 0);origRender->GetActiveCamera()->SetViewUp(0, 0, 1);origRender->GetActiveCamera()->Azimuth(30);origRender->GetActiveCamera()->Elevation(30);origRender->ResetCamera();//刷新照相機 linearRender->SetActiveCamera(origRender->GetActiveCamera());loopRender->SetActiveCamera(origRender->GetActiveCamera());butterflyRender->SetActiveCamera(origRender->GetActiveCamera());vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);rwi->Start();rw->Render();return 0; }輸出結果:紅色視窗為原始三角網格模型,綠色視窗采用了線性細分算法;藍色視窗采用Loop細分算法;黑色視窗采用了Butterfly細分算法。
鼻子部位的細節圖:
從上面結果上看,我們可以看出:線性細分效果似乎沒有起到多大作用??!Loop細分結果得到了很光滑的曲面,Butterfly細分在細節部分處理的并不很理想。
注意事項: 所有模型細化算子僅對三角網格數據有效,因此在處理多邊形數據時,需要通過VTKTriangleFilter將多邊形網格轉換為三角網格才能處理。
3.參考文獻
[1] Loop C T. Smooth Subdivision Surfaces Based on Triangles[J]. Department of Mathematics the University of Utah Masters Thesis, 1987.[2]?Zorin D, Der P, Sweldens W. Interpolating Subdivision for meshes with arbitrary topology[C]// Conference on Computer Graphics and Interactive Techniques. ACM, 1996:189-192.
4.參看資料
1.《C++ primer》2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開發進階[M]. 機械工業出版社, 2015.
總結
以上是生活随笔為你收集整理的VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VTK修炼之道52:图形基本操作进阶_多
- 下一篇: 我们学过 飞鸽传书 的应该知道