日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:图形基本操作进阶_多分辨率策略(模型细化的三种方法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。