生活随笔
收集整理的這篇文章主要介紹了
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:图形基本操作进阶——多分辨率策略(模型抽取的三种方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。