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繪制網格的接口中沒有實現繪制次刻度網格。若想繪制次刻度網格線,必須自己修改源碼實現繪制次網格線的代碼,修改源碼顯示次網格線的效果如下: