QT 基于VTK 显示三维坐标系

继承自上一篇博客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;
}

在添加坐标轴后,同时调用重置视角的函数,就大功告成了。效果如下

参考

 QT 基于VTK编写STL三维显示程序-CSDN博客

VTK: vtkAxesActor Class Reference

VTK:vtkOrientationMarkerWidget 类参考

VTK笔记——如何显示三维坐标系_vtk显示坐标系-CSDN博客

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值