继承自上一篇博客QT 基于VTK编写STL三维显示程序-CSDN博客
本篇希望在原有的基础上添加显示三维坐标系。分为两种:1.在原点处显示;2.在左下角固定显示。以下为具体实现步骤
1. 在原点处显示三维坐标轴
主要用到VTK的vtkAxesActor类。 关于这个类的详细介绍可见VTK: vtkAxesActor Class Reference
vtkAxesActor简介:vtkAxesActorvtkAxesActor是一个混合的 2D/3D Actor,用于表示场景中的 3D 轴。用户可以为轴或轴尖定义几何形状,还可以为三个轴设置文本。由于文本是通过vtkCaptionActor2D实现的,因此文本看起来会跟随摄像机移动。底层vtkCaptionActor2D对象的所有功能均可访问,例如,轴文本的字体属性可通过vtkTextProperty进行操作。由于该类继承自vtkProp3D,因此可以对底层几何图形和标签定位应用用户变换。例如,旋转变换可用于生成左旋轴表示法。
这里仅需要简单的应用,具体补充的代码如下
头文件中添加了如下代码
#include <vtkAxesActor.h>
源文件ImportSTL函数中加入了如下代码
vtkSmartPointer<vtkAxesActor> actor2 = vtkSmartPointer<vtkAxesActor>::New();//创建坐标轴演员
actor2->SetPosition(0, 0, 0);//设定坐标轴位置
actor2->SetTotalLength(10, 10, 10);//设定坐标轴三个轴的长度
actor2->SetShaftType(0);//设置轴的类型
actor2->SetAxisLabels(0);//坐标轴标签隐藏
actor2->SetCylinderRadius(0.02);//轴尖半径设置
renderer->AddActor(actor2);//添加至渲染器
效果如下
2. 左下角固定窗口显示三维坐标系
在原点处的坐标轴可能会因为窗口移动而看不见,因此固定在左下角显示坐标轴是常见的方式。
除了上步用到的vtkAxesActor类之外,还需要用到vtkOrientationMarkerWidget类。它是用于操作标记道具的 2D 小部件。
关于这个类的详细介绍可见VTK: vtkOrientationMarkerWidget Class Reference。这里就不多做说明,直接上代码。
为了方便,新建了一个Add_GlobalAxes函数,用于添加左下角三维坐标轴显示
头文件
#include <vtkSmartPointer.h>
#include <vtkAxesActor.h>
#include <vtkOrientationMarkerWidget.h>
.....
private:
void Add_GlobalAxes();//全局坐标函数
vtkSmartPointer<vtkOrientationMarkerWidget> axesWidget = vtkSmartPointer<vtkOrientationMarkerWidget>::New();//方向标记窗口
源文件
//添加显示坐标轴(Red, Green, Blue分别对应X,Y,Z三条轴)
void MainWindow::Add_GlobalAxes()
{
vtkSmartPointer<vtkAxesActor> actor_axes = vtkSmartPointer<vtkAxesActor>::New();
actor_axes->SetPosition(0, 0, 0);//设定坐标轴位置
double AXIS_LEN=10;
actor_axes->SetTotalLength(AXIS_LEN, AXIS_LEN, AXIS_LEN);//设定坐标轴三个轴的长度
actor_axes->SetShaftType(0);//设置轴的类型
actor_axes->SetAxisLabels(0);//坐标轴标签隐藏
actor_axes->SetCylinderRadius(0.02);//轴尖半径设置
// 设置坐标轴位置为左下角
axesWidget->SetOrientationMarker(actor_axes);//设置演员
axesWidget->SetInteractor(ui->widget->GetRenderWindow()->GetInteractor());//设置交互
axesWidget->SetEnabled(true);//打开
axesWidget->InteractiveOn();//打开交互
axesWidget->SetInteractive(false);//关闭交互——固定位置和大小
ui->statusbar->showMessage(tr(u8"添加全局坐标轴显示!"));//状态栏信息
}
然后在第一次显示模型时调用即可,效果如下
发现,此时窗口内视角出现问题,定位在原点处。鼠标缩小窗口才能看到模型。因此补充了一段调整视角的函数ResetViewCenter
头文件中添加了
#include <vtkCamera.h>
//函数声明
private:
void ResetViewCenter();//重置视角使得模型显示在中心
源文件
//函数定义
void MainWindow::ResetViewCenter()
{
//调整视图
vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
renderer->SetActiveCamera(camera);
renderer->ResetCamera(); // 自动调整相机视角使得模型显示在中心
return;
}
在添加坐标轴后,同时调用重置视角的函数,就大功告成了。效果如下
参考
VTK: vtkAxesActor Class Reference