QT——vtk显示坐标轴

发布时间 2023-07-23 21:37:12作者: 摩天仑

使用VTK中的vtkAxesActor和vtkOrientationMarkerWidget在左下角显示坐标轴,捣鼓了一天,才整成。

renWin_ = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
this->SetRenderWindow(renWin_);
renderer_ = vtkSmartPointer<vtkRenderer>::New();
renWin_->AddRenderer(renderer_);
interactor_ = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor_->SetRenderWindow(renWin_);
style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
interactor_->SetInteractorStyle(style); // 必须得加这个,不然interactor_没反应

vtkSmartPointer<vtkAxesActor> axes_actor = vtkSmartPointer<vtkAxesActor>::New();
axes_actor->SetTotalLength(2, 2, 2);
axes_actor->SetShaftType(0);
axes_actor->SetCylinderRadius(0.05);

markerWidget = vtkSmartPointer<vtkOrientationMarkerWidget>::New();
markerWidget->SetOrientationMarker(axes_actor);
markerWidget->SetOutlineColor(0.93, 0.57, 0.13);
//markerWidget->SetInteractor(this->GetRenderWindow()->GetInteractor());
markerWidget->SetInteractor(interactor_);
markerWidget->SetViewport(0.0, 0.0, 0.1, 0.2);
markerWidget->SetEnabled(1);
markerWidget->InteractiveOn();

interactor_->Initialize();
renWin_->Render();

注意:
| 得初始化一个vtkInteractorStyleTrackballCamera,是一种交互器样式(Interactor Style),用于在三维场景中通过鼠标交互控制相机(Camera)的位置和视角。当使用vtkInteractorStyleTrackballCamera时,可以通过以下方式来交互:
旋转:按下鼠标左键并拖动,可以围绕目标点旋转视角。
缩放:使用鼠标滚轮或按下鼠标右键并拖动,可以放大或缩小场景。
平移:按下鼠标中键(滚轮按下)并拖动,可以在平面上移动场景。
| vtkOrientationMarkerWidget得和交互器创建方式一样,同时在类中创建或者同时在函数中创建。

1、SetTotalLength

void SetTotalLength(double x, double y, double z);设置坐标轴的总长度
示例:
axes_actor->SetTotalLength(2, 2, 2);

2、SetShaftType

void SetShaftType(int type);用于设置坐标轴的轴身类型(shaft type)
type:一个整数值,用于指定坐标轴的轴身类型。VTK定义了几种不同的轴身类型,对应不同的整数值。常用的类型包括:
0:线性轴身(Linear shaft)
1:管状轴身(Cylinder shaft)
2:框状轴身(Square shaft)
3:不可见轴身(Hidden shaft)
示例:
axes_actor->SetShaftType(0);

3、SetEnabled

SetEnabled如果传入的值为1,则表示启用方向标记部件,即显示和允许交互;如果传入的值为0,则表示禁用方向标记部件,即隐藏并禁止交互
markerWidget->SetEnabled(1);

4、SetViewport

markerWidget->SetViewport(0.0, 0.0, 0.4, 0.4);用于指定在渲染窗口中显示方向标记部件的位置和大小。

minX:方向标记部件左下角相对于渲染窗口的横向位置,取值范围为[0.0, 1.0],其中0.0表示左侧,1.0表示右侧。
minY:方向标记部件左下角相对于渲染窗口的纵向位置,取值范围为[0.0, 1.0],其中0.0表示底部,1.0表示顶部。
maxX:方向标记部件右上角相对于渲染窗口的横向位置,取值范围为[0.0, 1.0],通常应保证maxX > minX。
maxY:方向标记部件右上角相对于渲染窗口的纵向位置,取值范围为[0.0, 1.0],通常应保证maxY > minY。

5、SetInteractive

要使方向标记部件变为非交互式,你应该使用SetInteractive方法,将其设置为false。