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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

VTL:图形基本操作进阶——多分辨率策略(模型抽取的三种方法)

發布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VTL:图形基本操作进阶——多分辨率策略(模型抽取的三种方法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.多分辨率處理策略

模型抽取Decimation)和細化(Subdivision)是兩個相反的操作,是三角形網格模型多分辨率處理中的兩個重要的操作。使用這兩個操作可以在保持模型拓撲結構的同時,得到不同分辨率的網格模型。模型抽取的作用是劍豪模中的點數據和單元數據,便于模型的后續處理與交互渲染,這類似于圖像時數據的將采樣。而網格細化則是利用一定的細化規則。而網格細化則是利用一定的細化規則,在給定的初始化
網格中插入新的點,從而不斷細化出新的網格單元,在極限細化情況下,該網格能夠收斂一個光滑的曲面。

2.網格抽取(Decimation)

2.1VTKDecimatePro
VTK 中有三個網格抽取l類:vtkDecimatePro、VTKQuadricDecimation、vtkQuadricClustering.
vtkDecimatePro是最常用的,該處理方法的原理,是一種塌陷的方法來刪除點和單元,處理的速度比較快,而且可以方便的控制網格抽取的幅度,得到不同級別的模型數據。

使用方法: vtkSmartPoint<vtkDecimatePro> decimate = vtkSmartPointer<vtkDecimatePro>::New(); decimate->SetInput(input); decimate->SetTargetReduction(0.6); decimate->update();

vtkDecimatePro接收一個單元為三角網格的vtkPolyData數據,其中函數SetTargetReduction()用于設置變量TargetReduction的大小,將網格面片抽取的比例控制在0~1.這里設置為0.6,說明有60%的三角面片單元將被移除。使用這個函數可以得到不同程度的簡化網格模型,不過,為確保函數效果,一般需要滿足下面四個條件:
vtkDecimatePro需要支持模型拓撲的改變,即將PreserveTopology變量的值設置為FALSE。
支持網格分裂,即Splitting變量的值設置為TRUE。
支持修改模型的邊界,即將變量BoundaryVetexDeletion的值設置為TRUE。
設置最大誤差變量MaximumError的值為VTK_DOUBLE_MAX。

2.2 vtkQuadricDecimation

該類也可以實現三角形網格簡化,并能較好地逼近原模型.該類雖然也提供了SetTargetReduction()函數用于設置模型簡化程度,但是最終簡化率并非嚴格等于程序中設置的簡化率。可以通過GetActualReduction()函數來獲取最終模型簡化率。

2.3 vtkQuadricClustering

該類是三種實現模型抽取算法中最快的一種,能夠處理大數據模型。通過StartAppend()、Append()、EndAppend()函數可以將整個模型分為多個網格片處理,從而避免一次性處理整個模型,減少內存開支,提高處理效率。

3.vtkDecimatePro用于模型抽取實驗

圖像簡化之后的效果:

#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h> #include <vtkPolyDataReader.h> #include <vtkDecimatePro.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkCamera.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h>int main() {vtkSmartPointer<vtkPolyDataReader> reader =vtkSmartPointer<vtkPolyDataReader>::New();reader->SetFileName("data/fran_cut.vtk");reader->Update();vtkSmartPointer<vtkPolyData> original = reader->GetOutput();std::cout << "抽取前" << "-----------------------" << std::endl;std::cout << "模型點數為: " << original->GetNumberOfPoints() << std::endl;std::cout << "模型面數為: " << original->GetNumberOfPolys() << std::endl;vtkSmartPointer<vtkDecimatePro> decimation =vtkSmartPointer<vtkDecimatePro>::New();decimation->SetInputData(reader->GetOutput());decimation->SetTargetReduction(0.6);decimation->Update();vtkSmartPointer<vtkPolyData> decimated = decimation->GetOutput();std::cout << "抽取后" << "-----------------------" << std::endl;std::cout << "模型點數為:" << decimated->GetNumberOfPoints() << std::endl;std::cout << "模型面數為:" << decimated->GetNumberOfPolys() << std::endl;///vtkSmartPointer<vtkPolyDataMapper> origMapper =vtkSmartPointer<vtkPolyDataMapper>::New();origMapper->SetInputData(reader->GetOutput());vtkSmartPointer<vtkActor> origActor =vtkSmartPointer<vtkActor>::New();origActor->SetMapper(origMapper);vtkSmartPointer<vtkPolyDataMapper> deciMapper =vtkSmartPointer<vtkPolyDataMapper>::New();deciMapper->SetInputData(decimation->GetOutput());vtkSmartPointer<vtkActor> deciActor =vtkSmartPointer<vtkActor>::New();deciActor->SetMapper(deciMapper);///double leftViewport[4] = { 0.0, 0.0, 0.5, 1.0 };double rightViewport[4] = { 0.5, 0.0, 1.0, 1.0 };vtkSmartPointer<vtkRenderer> leftRenderer =vtkSmartPointer<vtkRenderer>::New();leftRenderer->SetViewport(leftViewport);leftRenderer->AddActor(origActor);leftRenderer->SetBackground(1.0, 0, 0);vtkSmartPointer<vtkRenderer> rightRenderer =vtkSmartPointer<vtkRenderer>::New();rightRenderer->SetViewport(rightViewport);rightRenderer->AddActor(deciActor);rightRenderer->SetBackground(0, 0, 0);leftRenderer->GetActiveCamera()->SetPosition(0, -1, 0);leftRenderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);leftRenderer->GetActiveCamera()->SetViewUp(0, 0, 1);leftRenderer->GetActiveCamera()->Azimuth(30);leftRenderer->GetActiveCamera()->Elevation(30);leftRenderer->ResetCamera();//刷新照相機rightRenderer->SetActiveCamera(leftRenderer->GetActiveCamera());//同步顯示///vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(leftRenderer);rw->AddRenderer(rightRenderer);rw->SetSize(640, 320);rw->SetWindowName("PolyData Decimation");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);rwi->Start();return 0; }

總結

以上是生活随笔為你收集整理的VTL:图形基本操作进阶——多分辨率策略(模型抽取的三种方法)的全部內容,希望文章能夠幫你解決所遇到的問題。

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