VTK修炼之道48:图形基本操作进阶_符号化操作与模型区率计算
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道48:图形基本操作进阶_符号化操作与模型区率计算
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.符號化Glyphing再談
上一篇帖子提到一個事,就是用符號化操作顯示單元的法向量。 模型的法向量數(shù)據(jù)是向量數(shù)據(jù),因此法向量不能像前面講到的通過顏色映射來顯示。但是可以通過符號化(Glyphing)技術將法向量圖形化顯示。Glyphing是一種基于圖形的可視化技術,這些圖像可以是簡單的基本圖形,如具有方向的椎體,也可以是更加復雜的圖像。VTK中就是應用vtkGlyph3D類實現(xiàn)該功能的,并且可以支持Glyphing圖形的縮放、著色、設置空間姿態(tài)等。使用該類時,需要接受兩個輸入:一個是需要顯示的幾何數(shù)據(jù)點集合;另一個是Glyph圖形數(shù)據(jù),為vtkPolyData數(shù)據(jù)。 ? ? ?由于讀入的模型數(shù)據(jù)比較大,點比較多,因此使用vtkMaskPoints類采樣部分數(shù)據(jù),該類保留輸入數(shù)據(jù)中的點數(shù)據(jù)及其屬性,并支持點數(shù)據(jù)的采樣。為了減小計算量,隨機采樣了300個點做Glyphing顯示。將其輸出作為vtkGlyph3D的輸入數(shù)據(jù),而SetSourceData()設置了一個VTKArrowSource數(shù)據(jù)作為源數(shù)據(jù),這樣的效果是在輸入數(shù)據(jù)的每一個點處會顯示一個Glyph圖形,這里我選用的就是箭頭圖形。vtkGlyph3D::SetVectorModeToUseNormal()指定要使用法向量數(shù)據(jù)來控制Glyph圖形方向。vtkGlyph3D::SetScaleFactor()則控制Glyph圖形的大小。
2.曲率計算
曲率時曲面彎曲程度的一種度量,是幾何體的一種重要的局部特征。如下圖所示:要計算曲面上給定點M的曲率,考慮經(jīng)過M的法線的一個平面與曲面相交,得到一條二維曲面,稱之為曲面在M點的一條法截線。經(jīng)過M點法向量的曲面可以任意旋轉,即可得到任意多條法截面,如上圖所示。每一條法截線都會對應一個曲率,取具有最大曲率和最小曲率的兩條法截線為主法截線,例如上圖中的C1,C2;其對應的曲率分別記為k1,k2;稱為主曲率;高斯曲率等于主曲率的乘積即k1*k2;平均曲率等于主曲率k1,k2的平均值,即(k1+k2)/2;當然,這只是曲率的直觀幾何解釋,并沒有給出具體的計算公式。這個公式高中就接觸過:
vtk中vtkCurvatures類實現(xiàn)了四種計算網(wǎng)格模型點曲率的計算方法。該類接受一個vtkPolyData數(shù)據(jù),經(jīng)計算得到的曲率數(shù)據(jù)作為網(wǎng)格模型的點的屬性數(shù)據(jù)存入返回的vtkPolyData中。 下例實現(xiàn)了一個網(wǎng)格模型的曲率計算,并通過顏色映射表來顯示模型的表面曲率: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingFreeType);#include <vtkSmartPointer.h> #include <vtkPolyDataReader.h> #include <vtkCurvatures.h> #include <vtkLookupTable.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkScalarBarActor.h> #include <vtkPointData.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h>int main() {vtkSmartPointer<vtkPolyDataReader> reader =vtkSmartPointer<vtkPolyDataReader>::New();reader->SetFileName("fran_cut.vtk");reader->Update();vtkSmartPointer<vtkCurvatures> curvaturesFilter =vtkSmartPointer<vtkCurvatures>::New();curvaturesFilter->SetInputConnection(reader->GetOutputPort());//curvaturesFilter->SetCurvatureTypeToMinimum(); //最小曲率curvaturesFilter->SetCurvatureTypeToMaximum(); //最大曲率//curvaturesFilter->SetCurvatureTypeToGaussian();//高斯曲率//curvaturesFilter->SetCurvatureTypeToMean(); //平均曲率curvaturesFilter->Update();double scalarRange[2];curvaturesFilter->GetOutput()->GetScalarRange(scalarRange);//建立查找表 做顏色映射vtkSmartPointer<vtkLookupTable> lut =vtkSmartPointer<vtkLookupTable>::New();lut->SetHueRange(0.0, 0.6);lut->SetAlphaRange(1.0, 1.0);lut->SetValueRange(1.0, 1.0);lut->SetSaturationRange(1.0, 1.0);lut->SetNumberOfTableValues(256);lut->SetRange(scalarRange);lut->Build();///vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputData(curvaturesFilter->GetOutput());mapper->SetLookupTable(lut);mapper->SetScalarRange(scalarRange);vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);vtkSmartPointer<vtkScalarBarActor> scalarBar =vtkSmartPointer<vtkScalarBarActor>::New();scalarBar->SetLookupTable(mapper->GetLookupTable());scalarBar->SetTitle(curvaturesFilter->GetOutput()->GetPointData()->GetScalars()->GetName());scalarBar->SetNumberOfLabels(5); //設置5個標簽vtkSmartPointer<vtkRenderer> render =vtkSmartPointer<vtkRenderer>::New();render->AddActor(actor);render->AddActor2D(scalarBar);render->SetBackground(0, 0, 0);vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(render);rw->SetSize(640, 480);rw->SetWindowName("Calculating PolyData Curvature");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);rwi->Initialize();rwi->Start();return 0; }
首先讀入一個vtkPolyData人臉模型數(shù)據(jù),作為vtkCurvatures的輸入,并調(diào)用SetCurvatureTypeToMaximum()函數(shù)計算最大曲率,此外我們還可以定義最小曲率,高斯曲率,平均曲率。當然,四種曲率允許同時計算。 在內(nèi)部計算完曲率數(shù)據(jù)后,將其作為輸出的vtkPolyData點的屬性數(shù)據(jù)。保存屬性數(shù)據(jù)時,四種曲率數(shù)據(jù)分別對應屬性名字為Minimum_Curvature/Maximum_Curvature/Gauss_Curvature/Mean_Curvature,因此可以通過屬性名字獲取相應的曲率數(shù)據(jù)。例如要獲得高斯曲率數(shù)據(jù),可調(diào)用: vtkDoubleArray *gauss = static_cast<vtkDoubleArray*>( curvaturesFilter->GetOutput()->GetpointData()->GetArray("Gauss_Curvature"));為了能夠在模型上顯示曲率屬性數(shù)據(jù),采用顏色映射來顯示。定義了一個256色的VTKLookupTable對象,并設置了曲率數(shù)據(jù)的范圍。 然后將改顏色映射表添加到vtkPolyDataMapper中。 最后,我用到了一個新的VTKScalarBarActor類,該類支持一個顏色映射表轉換為一個Actor對象,將顏色表以圖形的形式顯示,并支持設置圖形相應的名字和翔實數(shù)據(jù)Label個數(shù)。最后顯示即可。
3.參看資料
1.《C++ primer》2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開發(fā)進階[M]. 機械工業(yè)出版社, 2015. 與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的VTK修炼之道48:图形基本操作进阶_符号化操作与模型区率计算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [视频]Google Chrome背后的
- 下一篇: VTK修炼之道49:图形基本操作进阶_网