VTK 對象繪制 3D坐標軸(vtkCubeAxesActor)


5.1 3D坐標軸(vtkCubeAxesActor)

5.1.1 對象接口說明

SetXAxisLabelVisibility(vtkTypeBool)

SetYAxisLabelVisibility(vtkTypeBool)

SetZAxisLabelVisibility(vtkTypeBool)

設置x、y、z軸刻度標簽是否顯示

SetXAxisTickVisibility(vtkTypeBool)

SetYAxisTickVisibility(vtkTypeBool)

SetZAxisTickVisibility(vtkTypeBool)

設置x、y、z軸刻度是否顯示

SetXAxisMinorTickVisibility(vtkTypeBool)

SetYAxisMinorTickVisibility(vtkTypeBool)

SetZAxisMinorTickVisibility(vtkTypeBool)

設置x、y、z軸次刻度是否顯示

SetDrawXGridlines(vtkTypeBool)

SetDrawYGridlines(vtkTypeBool)

SetDrawZGridlines(vtkTypeBool)

設置是否繪制x、y、z軸的網格線

SetDrawXInnerGridlines(vtkTypeBool)

SetDrawYInnerGridlines(vtkTypeBool)

SetDrawZInnerGridlines(vtkTypeBool)

設置是否繪制x、y、z軸的網格線的內部網格線

SetDrawXGridpolys(vtkTypeBool)

SetDrawYGridpolys(vtkTypeBool)

SetDrawZGridpolys(vtkTypeBool)

設置是否繪制x、y、z軸的網格線的內部網格面

SetLabelScaling(bool,int,int,int)

設置刻度標簽的顯示樣式,假設坐標軸的值范圍為0-200000,當參數1為false時,刻度標簽按0-200000顯示;參數1為true時,按0-200顯示

SetXAxisRange(double,double)

SetYAxisRange(double,double)

SetZAxisRange(double,double)

設置x、y、z軸值的范圍

SetScreenSize (double screenSize)

設置標題和標簽文本的屏幕大小。默認值為10.0。

SetLabelOffset (double offset)

指定標簽與軸之間的距離。默認值為20.0。

SetTitleOffset(double)

設置標題和刻度標簽之間的距離。默認為20.0

SetCamera(vtkCamera *)

設置相機,以執行縮放。一般是將當前render的相機設置給坐標軸。

SetFlyMode(int)

指定一種模式來控制軸的繪制方式

enum FlyMode

{

VTK_FLY_OUTER_EDGES = 0,//外邊緣

VTK_FLY_CLOSEST_TRIAD = 1,//最近位置

VTK_FLY_FURTHEST_TRIAD = 2,//最遠位置

VTK_FLY_STATIC_TRIAD = 3,//靜態最近位置,不隨攝像頭動而跳變位置。

VTK_FLY_STATIC_EDGES = 4 //靜態所有外邊緣位置,不隨攝像頭動而跳變位置。

};

SetXTitle (const char *)

SetYTitle (const char *)

SetZTitle (const char *)

設置x、y、z軸的標題

SetTickLocation

設置刻度線顯示的位置

enum TickLocation

{

VTK_TICKS_INSIDE = 0,//內部

VTK_TICKS_OUTSIDE = 1,//外部

VTK_TICKS_BOTH = 2//兩側

};

SetInertia (int)

設置慣性因子,該慣性因子控制軸切換位置的頻率(從一個軸跳到另一個軸),范圍為1到VTK_INT_MAX。默認值是1

SetCornerOffset (double)

指定一個偏移量值,以便從軸連接的角“拉回”軸,以避免軸標簽重疊。默認值是0

SetXAxisVisibility(vtkTypeBool)

SetYAxisVisibility(vtkTypeBool)

SetZAxisVisibility(vtkTypeBool)

設置x、y、z軸的顯示狀態。

SetGridLineLocation

指定網格線呈現的樣式

enum GridVisibility

{

VTK_GRID_LINES_ALL = 0,//呈現所有網格線

VTK_GRID_LINES_CLOSEST = 1,//呈現最近的三個軸的網格線

VTK_GRID_LINES_FURTHEST =  2//呈現最遠的三個軸的網格線

};

5.1.2 代碼實現

 1 void ESAxes::create()  2 {  3     m_cubeAxesActor = vtkSmartPointer<vtkCubeAxesActor>::New();  4     m_cubeAxesActor->SetCamera(m_pRender->GetActiveCamera());  5     //
 6     //軸的設置  7     //設置x、y、z軸的起始和終止值
 8     m_cubeAxesActor->SetXAxisRange(0, 200000);  9     m_cubeAxesActor->SetYAxisRange(0, 200000); 10     m_cubeAxesActor->SetZAxisRange(0, 200000); 11     //設置坐標軸線的寬度
12     m_cubeAxesActor->GetXAxesLinesProperty()->SetLineWidth(0.5); 13     m_cubeAxesActor->GetYAxesLinesProperty()->SetLineWidth(0.5); 14     m_cubeAxesActor->GetZAxesLinesProperty()->SetLineWidth(0.5); 15     //設置標題和標簽文本的屏幕大小。默認值為10.0。
16     m_cubeAxesActor->SetScreenSize(6); 17     //指定標簽與軸之間的距離。默認值為20.0。
18     m_cubeAxesActor->SetLabelOffset(5); 19     //顯示坐標軸
20     m_cubeAxesActor->SetVisibility(true); 21     //指定一種模式來控制軸的繪制方式
22     m_cubeAxesActor->SetFlyMode(0); 23     //設置慣性因子,該慣性因子控制軸切換位置的頻率(從一個軸跳到另一個軸) 24     //m_cubeAxesActor->SetInertia(1); 25     //
26     //網格設置 27     //開啟x、y、z軸的網格線繪制
28     m_cubeAxesActor->DrawXGridlinesOn(); 29     m_cubeAxesActor->DrawYGridlinesOn(); 30     m_cubeAxesActor->DrawZGridlinesOn(); 31     //設置x、y、z軸的內部網格線不繪制
32     m_cubeAxesActor->SetDrawXInnerGridlines(false); 33     m_cubeAxesActor->SetDrawYInnerGridlines(false); 34     m_cubeAxesActor->SetDrawZInnerGridlines(false); 35     //設置x、y、z軸網格線的顏色
36     m_cubeAxesActor->GetXAxesGridlinesProperty()->SetColor(0.5, 0.5, 0.5); 37     m_cubeAxesActor->GetYAxesGridlinesProperty()->SetColor(0.5, 0.5, 0.5); 38     m_cubeAxesActor->GetZAxesGridlinesProperty()->SetColor(0.5, 0.5, 0.5); 39     //指定網格線呈現的樣式
40     m_cubeAxesActor->SetGridLineLocation(2); 41     //
42     //刻度的設置 43     //不顯示x、y、z軸的次刻度
44     m_cubeAxesActor->XAxisMinorTickVisibilityOff(); 45     m_cubeAxesActor->YAxisMinorTickVisibilityOff(); 46     m_cubeAxesActor->ZAxisMinorTickVisibilityOff(); 47     //設置刻度標簽的顯示方式(參數1為false,刻度標簽按0-200000顯示;為true時,按0-200顯示)
48     m_cubeAxesActor->SetLabelScaling(false, 0, 0, 0); 49     //設置刻度線顯示的位置(內部、外部、兩側)
50     m_cubeAxesActor->SetTickLocation(1); 51     // 52     m_pRender->AddActor(m_cubeAxesActor); 53     m_pRender->ResetCamera(); 54     m_pRender->ResetCameraClippingRange(); 55     m_pRenderWnd->Render(); 56 }

5.1.3 擴展

5.1.3.1 顯示問題-刻度與網格線分離

如下圖:

較好的顯示效果應該為:1處有網格線,2和3處有刻度標注。

出現該問題的原因:

(1)首先,vtkCubeAxesActor對象的構造函數中是分別為x、y、z三個方向都創建了4個vtkAxisActor對象,代碼如下:

 1 vtkCubeAxesActor::vtkCubeAxesActor() : vtkActor()  2 {  3 。。。  4   for (int i = 0; i < NUMBER_OF_ALIGNED_AXIS; i++)  5  {  6     this->XAxes[i] = vtkAxisActor::New();  7     this->XAxes[i]->SetTickVisibility(1);  8     this->XAxes[i]->SetMinorTicksVisible(1);  9     this->XAxes[i]->SetLabelVisibility(1); 10     this->XAxes[i]->SetTitleVisibility(1); 11     this->XAxes[i]->SetAxisTypeToX(); 12 。。。 13  
14     this->YAxes[i] = vtkAxisActor::New(); 15     this->YAxes[i]->SetTickVisibility(1); 16     this->YAxes[i]->SetMinorTicksVisible(1); 17     this->YAxes[i]->SetLabelVisibility(1); 18     this->YAxes[i]->SetTitleVisibility(1); 19     this->YAxes[i]->SetAxisTypeToY(); 20     this->YAxes[i]->SetAxisPosition(i); 21     this->YAxes[i]->SetAxisLinesProperty(this->YAxesLinesProperty); 22     this->YAxes[i]->SetGridlinesProperty(this->YAxesGridlinesProperty); 23     this->YAxes[i]->SetInnerGridlinesProperty(this->YAxesInnerGridlinesProperty); 24 。。。 25  
26     this->ZAxes[i] = vtkAxisActor::New(); 27     this->ZAxes[i]->SetTickVisibility(1); 28     this->ZAxes[i]->SetMinorTicksVisible(1); 29     this->ZAxes[i]->SetLabelVisibility(1); 30     this->ZAxes[i]->SetTitleVisibility(1); 31     this->ZAxes[i]->SetAxisTypeToZ(); 32  。。。 33 。。。 34 。。。 35 }

NUMBER_OF_ALIGNED_AXIS = 4。

而針對指定網格線呈現的樣式為VTK_GRID_LINES_FURTHEST時,x、y、z方向的都各只有一個vtkAxisActor會畫網格線且不呈現刻度標注,代碼如下:

 1 void vtkCubeAxesActor::UpdateGridLineVisibility(int idx)  2 {  3   if( this->GridLineLocation != VTK_GRID_LINES_ALL &&
 4       (this->DrawXGridlines || this->DrawYGridlines || this->DrawZGridlines) )  5  {  6     for(int i=0; i < NUMBER_OF_ALIGNED_AXIS; ++i)  7  {  8       this->XAxes[i]->SetDrawGridlines(0);  9       this->YAxes[i]->SetDrawGridlines(0); 10       this->ZAxes[i]->SetDrawGridlines(0); 11       this->XAxes[i]->SetDrawGridlinesOnly(0); 12       this->YAxes[i]->SetDrawGridlinesOnly(0); 13       this->ZAxes[i]->SetDrawGridlinesOnly(0); 14  } 15     int xId = vtkCubeAxesActorTriads[idx][0]; 16     int yId = vtkCubeAxesActorTriads[idx][1]; 17     int zId = vtkCubeAxesActorTriads[idx][2]; 18     this->XAxes[xId]->SetDrawGridlines(this->DrawXGridlines); 19     this->YAxes[yId]->SetDrawGridlines(this->DrawYGridlines); 20     this->ZAxes[zId]->SetDrawGridlines(this->DrawZGridlines); 21     // Update axis render list
22     int id = 0; 23     if(this->NumberOfAxesX == 1) 24  { 25       id = this->RenderAxesX[this->NumberOfAxesX] = vtkCubeAxesActorTriads[idx][0]; 26       this->XAxes[id]->SetDrawGridlinesOnly((this->RenderAxesX[0] != id) ? 1 : 0); 27       this->NumberOfAxesX += (this->RenderAxesX[0] != id) ? 1 : 0; 28  } 29     if(this->NumberOfAxesY == 1) 30  { 31       id = this->RenderAxesY[this->NumberOfAxesY] = vtkCubeAxesActorTriads[idx][1]; 32       this->YAxes[id]->SetDrawGridlinesOnly((this->RenderAxesY[0] != id) ? 1 : 0); 33       this->NumberOfAxesY += (this->RenderAxesY[0] != id) ? 1 : 0; 34  } 35     if(this->NumberOfAxesZ == 1) 36  { 37       id = this->RenderAxesZ[this->NumberOfAxesZ] = vtkCubeAxesActorTriads[idx][2]; 38       this->ZAxes[id]->SetDrawGridlinesOnly((this->RenderAxesZ[0] != id) ? 1 : 0); 39       this->NumberOfAxesZ += (this->RenderAxesZ[0] != id) ? 1 : 0; 40  } 41  } 42 }

網格線是由圖中箭頭所指的vtkAxisActor對象繪制出來的,我們可以從vtkAxisActor繪制網格線的代碼中看到:

 1 void vtkAxisActor::BuildAxisGridLines(  2 double p1[3], double p2[3], double localCoordSys[3][3])  3 {  4 。。。  5   // - Insert Gridlines points along the axis using the DeltaMajor vector
 6   double nbIterationAsDouble = (axisLength - axisShift) / vtkMath::Norm(deltaVector);  7   int nbIteration = vtkMath::Floor(nbIterationAsDouble + 2 * FLT_EPSILON) + 1;  8   nbIteration = (nbIteration < VTK_MAX_TICKS) ? nbIteration : VTK_MAX_TICKS;  9   for (int nbTicks = 0; nbTicks < nbIteration; nbTicks++) 10  { 11     // Closest U
12     this->GridlinePts->InsertNextPoint(gridPointClosest); 13     this->GridlinePts->InsertNextPoint(gridPointU); 14     // Farest U
15     this->GridlinePts->InsertNextPoint(gridPointFarest); 16     this->GridlinePts->InsertNextPoint(gridPointU); 17     // Closest V
18     this->GridlinePts->InsertNextPoint(gridPointClosest); 19     this->GridlinePts->InsertNextPoint(gridPointV); 20     // Farest V
21     this->GridlinePts->InsertNextPoint(gridPointFarest); 22     this->GridlinePts->InsertNextPoint(gridPointV); 23     // PolyPoints
24     this->GridpolyPts->InsertNextPoint(gridPointClosest); 25     this->GridpolyPts->InsertNextPoint(gridPointU); 26     this->GridpolyPts->InsertNextPoint(gridPointFarest); 27 this->GridpolyPts->InsertNextPoint(gridPointV); 28 。。。 29 } 30 。。。 31 }

5.1.3.2 顯示問題-次刻度的網格沒有繪制

次刻度的網格之所以沒有繪制,是因為在vtkAxisActor繪制網格的接口中沒有實現繪制次刻度網格。若想繪制次刻度網格線,必須自己修改源碼實現繪制次網格線的代碼,修改源碼顯示次網格線的效果如下:


免責聲明!

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



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