VTK 圖形基本操作進階_符號化操作與模型區率計算


1.符號化Glyphing再談

上一篇帖子提到一個事,就是用符號化操作顯示單元的法向量。
模型的法向量數據是向量數據,因此法向量不能像前面講到的通過顏色映射來顯示。但是可以通過符號化(Glyphing)技術將法向量圖形化顯示。Glyphing是一種基於圖形的可視化技術,這些圖像可以是簡單的基本圖形,如具有方向的椎體,也可以是更加復雜的圖像。VTK中就是應用vtkGlyph3D類實現該功能的,並且可以支持Glyphing圖形的縮放、着色、設置空間姿態等。使用該類時,需要接受兩個輸入:一個是需要顯示的幾何數據點集合;另一個是Glyph圖形數據,為vtkPolyData數據。
     
由於讀入的模型數據比較大,點比較多,因此使用vtkMaskPoints類采樣部分數據,該類保留輸入數據中的點數據及其屬性,並支持點數據的采樣。為了減小計算量,隨機采樣了300個點做Glyphing顯示。將其輸出作為vtkGlyph3D的輸入數據,而SetSourceData()設置了一個VTKArrowSource數據作為源數據,這樣的效果是在輸入數據的每一個點處會顯示一個Glyph圖形,這里我選用的就是箭頭圖形。vtkGlyph3D::SetVectorModeToUseNormal()指定要使用法向量數據來控制Glyph圖形方向。vtkGlyph3D::SetScaleFactor()則控制Glyph圖形的大小。

2.曲率計算

曲率時曲面彎曲程度的一種度量,是幾何體的一種重要的局部特征。如下圖所示:
要計算曲面上給定點M的曲率,考慮經過M的法線的一個平面與曲面相交,得到一條二維曲面,稱之為曲面在M點的一條法截線。經過M點法向量的曲面可以任意旋轉,即可得到任意多條法截面,如上圖所示。每一條法截線都會對應一個曲率,取具有最大曲率和最小曲率的兩條法截線為主法截線,例如上圖中的C1,C2;其對應的曲率分別記為k1,k2;稱為主曲率;高斯曲率等於主曲率的乘積即k1*k2;平均曲率等於主曲率k1,k2的平均值,即(k1+k2)/2;當然,這只是曲率的直觀幾何解釋,並沒有給出具體的計算公式。這個公式高中就接觸過:
vtk中vtkCurvatures類實現了四種計算網格模型點曲率的計算方法。該類接受一個vtkPolyData數據,經計算得到的曲率數據作為網格模型的點的屬性數據存入返回的vtkPolyData中。
下例實現了一個網格模型的曲率計算,並通過顏色映射表來顯示模型的表面曲率:
 1 #include <vtkAutoInit.h>
 2 VTK_MODULE_INIT(vtkRenderingOpenGL);  3 VTK_MODULE_INIT(vtkInteractionStyle);  4 VTK_MODULE_INIT(vtkRenderingFreeType);  5  
 6 #include <vtkSmartPointer.h>
 7 #include <vtkPolyDataReader.h>
 8 #include <vtkCurvatures.h>
 9 #include <vtkLookupTable.h>
10 #include <vtkPolyDataMapper.h>
11 #include <vtkActor.h>
12 #include <vtkScalarBarActor.h>
13 #include <vtkPointData.h>
14 #include <vtkRenderer.h>
15 #include <vtkRenderWindow.h>
16 #include <vtkRenderWindowInteractor.h>
17  
18 int main() 19 { 20     vtkSmartPointer<vtkPolyDataReader> reader =
21         vtkSmartPointer<vtkPolyDataReader>::New(); 22     reader->SetFileName("fran_cut.vtk"); 23     reader->Update(); 24     
25     vtkSmartPointer<vtkCurvatures> curvaturesFilter =
26         vtkSmartPointer<vtkCurvatures>::New(); 27     curvaturesFilter->SetInputConnection(reader->GetOutputPort()); 28     //curvaturesFilter->SetCurvatureTypeToMinimum(); //最小曲率
29     curvaturesFilter->SetCurvatureTypeToMaximum();   //最大曲率 30     //curvaturesFilter->SetCurvatureTypeToGaussian();//高斯曲率 31     //curvaturesFilter->SetCurvatureTypeToMean(); //平均曲率
32     curvaturesFilter->Update(); 33  
34     double scalarRange[2]; 35     curvaturesFilter->GetOutput()->GetScalarRange(scalarRange); 36     //建立查找表 做顏色映射
37     vtkSmartPointer<vtkLookupTable> lut =
38         vtkSmartPointer<vtkLookupTable>::New(); 39     lut->SetHueRange(0.0, 0.6); 40     lut->SetAlphaRange(1.0, 1.0); 41     lut->SetValueRange(1.0, 1.0); 42     lut->SetSaturationRange(1.0, 1.0); 43     lut->SetNumberOfTableValues(256); 44     lut->SetRange(scalarRange); 45     lut->Build(); 46     /// 47     vtkSmartPointer<vtkPolyDataMapper> mapper =
48         vtkSmartPointer<vtkPolyDataMapper>::New(); 49     mapper->SetInputData(curvaturesFilter->GetOutput()); 50     mapper->SetLookupTable(lut); 51     mapper->SetScalarRange(scalarRange); 52  
53     vtkSmartPointer<vtkActor> actor =
54         vtkSmartPointer<vtkActor>::New(); 55     actor->SetMapper(mapper); 56  
57     vtkSmartPointer<vtkScalarBarActor> scalarBar =
58         vtkSmartPointer<vtkScalarBarActor>::New(); 59     scalarBar->SetLookupTable(mapper->GetLookupTable()); 60     scalarBar->SetTitle(curvaturesFilter->GetOutput()->GetPointData()->GetScalars()->GetName()); 61     scalarBar->SetNumberOfLabels(5); //設置5個標簽
62  
63     vtkSmartPointer<vtkRenderer> render =
64         vtkSmartPointer<vtkRenderer>::New(); 65     render->AddActor(actor); 66     render->AddActor2D(scalarBar); 67     render->SetBackground(0, 0, 0); 68  
69     vtkSmartPointer<vtkRenderWindow> rw =
70         vtkSmartPointer<vtkRenderWindow>::New(); 71     rw->AddRenderer(render); 72     rw->SetSize(640, 480); 73     rw->SetWindowName("Calculating PolyData Curvature"); 74  
75     vtkSmartPointer<vtkRenderWindowInteractor> rwi =
76         vtkSmartPointer<vtkRenderWindowInteractor>::New(); 77     rwi->SetRenderWindow(rw); 78     rwi->Initialize(); 79     rwi->Start(); 80     return 0; 81 }
首先讀入一個vtkPolyData人臉模型數據,作為vtkCurvatures的輸入,並調用SetCurvatureTypeToMaximum()函數計算最大曲率,此外我們還可以定義最小曲率,高斯曲率,平均曲率。當然,四種曲率允許同時計算。
在內部計算完曲率數據后,將其作為輸出的vtkPolyData點的屬性數據。保存屬性數據時,四種曲率數據分別對應屬性名字為Minimum_Curvature/M aximum_Curvature/Gauss_Curvature/Mean_Curvature,因此可以通過屬性名字獲取相應的曲率數據。例如要獲得高斯曲率數據,可調用:
1 vtkDoubleArray *gauss = static_cast<vtkDoubleArray*>( 2 curvaturesFilter->GetOutput()->GetpointData()->GetArray("Gauss_Curvature"));
為了能夠在模型上顯示曲率屬性數據,采用顏色映射來顯示。定義了一個256色的VTKLookupTable對象,並設置了曲率數據的范圍。
然后將改顏色映射表添加到vtkPolyDataMapper中。
最后,我用到了一個新的VTKScalarBarActor類,該類支持一個顏色映射表轉換為一個Actor對象,將顏色表以圖形的形式顯示,並支持設置圖形相應的名字和翔實數據Label個數。最后顯示即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM