(七)QVTKOpenGLNativeWidget中显示坐标轴

news2024/11/8 9:08:08

为了方便观察图像的方向,位置以及旋转情况,想在窗口中添加一个坐标轴显示,并且这个坐标轴是随着窗口的旋转变动的,在网上找了很多例子,但是最后就是不显示坐标轴。

在此记录一下。

一、坐标轴相关类简单介绍

1.vtkAxesActor

SetPosition(double,double, double);设置坐标系的原点位置

void SetTotalLength(double x, double y, double z);设置坐标轴的总长度

void SetShaftType(int type);设置坐标轴的轴身类型(int type)
0:柱状轴身
1:线性轴身

如果类型为0:SetCylinderRadius(double):设置柱状轴半径

SetTipType(int type); 设置坐标轴的轴顶部类型
0:圆锥体
1:球体
如果类型为0:SetConeResolution(double);设置锥面数
                             SetConeRadius(double);设置锥半径
如果类型为1:SetSphereResolution(double);设置球面数
                             SetSphereRadius(double);设置球半径

SetAxisLabels(bool);是否显示标签

SetXAxisLabelText(const char *);
SetYAxisLabelText(const char *);
SetZAxisLabelText(const char *);
设置轴标签

GetXAxisShaftProperty
GetYAxisShaftProperty
GetZAxisShaftProperty
获取轴属性,返回vtkProperty可直接设置属性

GetXAxisTipProperty
GetYAxisTipProperty
GetZAxisTipProperty
获取轴顶部属性,返回vtkProperty可直接设置属性

2.vtkOrientationMarkerWidget

SetOrientationMarker(vtkProp *prop);设置坐标轴

SetInteractor(vtkRenderWindowInteractor* iren);设置交互器

SetViewport(double minX,double minY, double maxX, double maxY);用于指定在渲染窗口中显示方向标记部件的位置和大小。
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。

SetEnabled(bool);是否显示

SetInteractive(bool);是否可为交互式  1(是):InteractiveOn 0(否):InteractiveOff

默认为交互式

SetOutlineColor(double,double,double);设置外边框颜色

二、代码示例

 具体有关库的引用,main.cpp的修改,以及QVTKOpenGLNativeWidget控件的添加请看前面详细介绍的文章,下面只放了主要代码。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include "vtkAutoInit.h"   // vtk初始化的方式
VTK_MODULE_INIT(vtkRenderingOpenGL2);   // 渲染
VTK_MODULE_INIT(vtkInteractionStyle);   // 相互做用方式
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);  //
VTK_MODULE_INIT(vtkRenderingFreeType);
#include <QWidget>
#include "vtkActor.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderer.h"
#include <vtkNew.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkAxesActor.h>
#include <vtkOrientationMarkerWidget.h>
#include "vtkConeSource.h"
#include "vtkCamera.h"
#include <vtkProperty.h>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;

    vtkSmartPointer<vtkOrientationMarkerWidget> MarkerWidget;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();//在构造函数中进行初始化
    //显示
    vtkNew<vtkGenericOpenGLRenderWindow> renwindow;
    renwindow->AddRenderer(renderer);
    ui->vtk_widget->SetRenderWindow(renwindow.Get());

    // 显示坐标系的vtk组件
    vtkSmartPointer<vtkAxesActor> axes_actor = vtkSmartPointer<vtkAxesActor>::New();
    axes_actor->SetPosition(0, 0, 0);
    axes_actor->SetTotalLength(2, 2, 2);
    axes_actor->SetShaftType(0);
    axes_actor->SetCylinderRadius(0.03);
    axes_actor->SetAxisLabels(1);
    axes_actor->SetTipType(0);
    axes_actor->SetXAxisLabelText("xxx");
    axes_actor->GetXAxisShaftProperty()->SetColor(1,1,1);
    axes_actor->GetYAxisTipProperty()->SetColor(1,1,1);

    // 控制坐标系,使之随视角共同变化
    MarkerWidget = vtkSmartPointer<vtkOrientationMarkerWidget>::New();
    MarkerWidget->SetOrientationMarker(axes_actor);
    MarkerWidget->SetInteractor(ui->vtk_widget->GetInteractor());
    MarkerWidget->SetViewport(0.0, 0.0, 0.2, 0.2);
    MarkerWidget->SetEnabled(1);
    MarkerWidget->SetOutlineColor(1,0,0);

    //锥
    vtkSmartPointer<vtkConeSource> Cone = vtkSmartPointer<vtkConeSource>::New();
    vtkSmartPointer<vtkPolyDataMapper> mapper_Cone = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper_Cone->SetInputConnection(Cone->GetOutputPort());

    vtkSmartPointer<vtkActor> actor_Cone = vtkSmartPointer<vtkActor>::New();
    actor_Cone->SetMapper(mapper_Cone);
    renderer->AddActor(actor_Cone);

    renderer->ResetCamera();
}

Widget::~Widget()
{
    delete ui;
}

 效果展示:

需要注意:我一开始的死活不显示坐标轴,找了一整天这个问题,然后把  vtkSmartPointer<vtkOrientationMarkerWidget> MarkerWidget;的定义放到头文件之后就显示出来了,看到有一种说法是MarkerWidget被析够了。如果有知道的网友欢迎评论告知!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1114587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW生成和打印条形码

LabVIEW生成和打印条形码 想在LabVIEW中生成条形码然后打印条形码。但是&#xff0c;当尝试使用任何一个打印VI来从LabVIEW打印条形码字体时&#xff0c;打印机中的字体是扭曲的。该如何解决这个问题&#xff1f; 首先&#xff0c;需要条形码字体。如果没有&#xff0c;可以从…

水质分析仪MQTT应用案例

水质分析仪MQTT应用案例 一、公司介绍 某仪器股份有限公司&#xff0c;集研发&#xff0c;生产&#xff0c;销售于一体的水质分析仪器公司。产品主要包括PH/ORP分析仪&#xff0c;电导度分析仪&#xff0c;溶氧分析仪&#xff0c;离子浓度分析仪&#xff0c;浊度分析仪及重金…

靠做网络安全,工资是同龄人的5倍:赚钱真的不能靠拼命!

最近在知乎看到一个测试&#xff0c;特扎心&#xff1a; 以下三种情况&#xff0c;哪个最让你绝望&#xff1f; ❶ 每月工资去掉开销还存不到3千&#xff1b; ❷ 家人突然急病住院&#xff0c;医药费10万&#xff1b; ❸ 同班的家长都在争先恐后给孩子报名各种辅导班、兴趣…

【python】文件和异常

文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词&#xff0c;可能需要先科普一下关于文件系统的知识&#xff0c;但是这里我们并不浪费笔墨介绍这个概念&#xff0c;请大…

实用API管理平台推荐:Apipost

在数字化时代&#xff0c;API已成为企业和开发者实现数据互通、应用集成的重要桥梁。然而&#xff0c;随着API数量的不断增加&#xff0c;API设计、调试、文档和测试等工作也变得越来越复杂。为了解决这一痛点&#xff0c;一款名为Apipost的API协同研发工具应运而生&#xff0c…

凝聚生态合力|汉得智慧营销中台O2与燕千云深度集成,助力企业数智化发展!

数字化转型&#xff0c;引领未来。在这个科技快速发展的时代&#xff0c;数字化转型已经成为企业发展的必然选择&#xff0c;通过运用先进的技术和创新的思维&#xff0c;企业可以实现业务流程的优化和效率的提升。 数字化转型不仅仅是一种工具&#xff0c;更是一种战略&#x…

可视化工具Datart踩(避)坑指南(6)——避免多人同时编辑

作为目前国内开源版本最好用的可视化工具&#xff0c;Datart无疑是低成本高效率可供二开的可视化神兵利器。当然&#xff0c;免费的必然要付出一些踩坑的代价。本篇我们来讲一讲可视化工具Datart踩&#xff08;避&#xff09;坑指南&#xff08;6&#xff09;之避免多人同时编辑…

酷克数据发布HD-SQL-LLaMA模型,开启数据分析“人人可及”新时代

随着行业数字化进入深水区&#xff0c;企业的关注点正在不断从“数字”价值转向“数智”价值。然而&#xff0c;传统数据分析的操作门槛与时间成本成为了掣肘数据价值释放的阻力。常规的数据分析流程复杂冗长&#xff0c;需要数据库管理员设计数据模型&#xff0c;数据工程师进…

x86 架构的机载计算机,它来了!

Allspark 2-x86采用Intel酷睿11代或12代CPU&#xff0c;x86架构&#xff0c;适用于无人机等机器人运行SLAM、VIO等复杂逻辑和高精度的机器视觉任务。预装 Ubuntu 22.04或Windows 11&#xff0c;满足多种使用场景。 市面上现有的一些NUC产品&#xff0c;不仅没有针对移动机器人使…

Deepfake!黑客冒充非洲联盟主席与多位欧洲领导人通话

黑客利用人工智能冒充非洲联盟委员会主席穆萨-法基&#xff08;Moussa Faki&#xff09;与多位欧洲领导人通话。 法基的发言人 Ebba Kalondo 在 X&#xff08;前 Twitter&#xff09;上发文称&#xff0c;网络不法分子假冒法基与一些欧洲国家首都城市领导人进行了深度伪造视频通…

OFDM同步--符号定时偏差STO

参考书籍&#xff1a;《MIMO-OFDM无线通信技术及MATLAB实现》 实验图基本都截取自该本书 一、什么是STO OFDM在接收时需要做FFT&#xff0c;需要在OFDM符号周期内获得对发射信号的精确采样&#xff0c;即在去CP之后我们需要找到OFDM的起始位&#xff0c;这样进行FFT运算时才能…

千耘导航助力冬小麦抢种,农户节本增效待丰收

随着秋收工作的结束&#xff0c;冬小麦等作物进入种植期。多地趁着晴好天&#xff0c;抢抓农时&#xff0c;启动冬小麦的耕种。 为了确保粮食增产的目标顺利达成&#xff0c;贯彻落实“藏粮于地、藏粮于技”战略&#xff0c;作为主要粮食作物之一的秋季冬小麦的种植任务随之加重…

使用poco出现Cannot find any visible node by query UIObjectProxy of “xxx“怎么办

在编写脚本的时候&#xff0c;使用poco的控件识别已经是大家非常喜欢的一种方式&#xff0c;准确度很高&#xff0c;而且也很容上手。 但是有时候会出现下面这种报错&#xff0c;提示 Cannot find any visible node by query UIObjectProxy of “xxx“这个时候是不是开始着急…

网络编程开发及实战(下)

一、IO模型 一、基本概念 &#xff08;一&#xff09;I/O基本概念 1、基本概念 1&#xff09;一个完整I/O分为两个阶段&#xff1a; 用户进程空间->内核空间 内核空间->设备空间&#xff08;磁盘、网卡&#xff09; 2&#xff09;内存I/O&#xff08;无名管道&…

YOLOv5算法改进(13)— 如何去更换主干网络(2)(包括代码+添加步骤+网络结构图)

前言:Hello大家好,我是小哥谈。为了给后面YOLOv5算法的进阶改进奠定基础,本篇文章就继续通过案例的方式给大家讲解如何在YOLOv5算法中更换主干网络,本篇文章的特色就是比较浅显易懂,附加了很多的网络结构图,通过结构图的形式向大家娓娓道来,希望大家学习之后能够有所收获…

大咖云集,智慧碰撞|第 18 届 CLK 大会完整议程揭晓(内附报名通道)

自 2006 年以来&#xff0c;在国内 Linux 技术爱好者和行业公司的鼎力支持下&#xff0c;中国 Linux 内核开发者大会已走过 17个年头&#xff0c;是中国 Linux 内核领域最具影响力的峰会之一。今年的中国内核开发者大会依然秉承历届理念&#xff0c;以“自由、协作、创新”为理…

C++学习:类

一、类的概念 类是一种将抽象转换为用户定义类型的C工具&#xff0c;它将数据和数据处理组合成一个整体。 比如股票类&#xff0c;首先要考虑如何表示股票。可以将某人持有的股票当成一个基本单元&#xff0c;数据包括他持有股票的数量&#xff0c;哪个公司的股票&#xff0c…

addEventListener与useeffect相撞的火花

const [a, seta] useState(1) const [loading, setLoading] useState(false) //用于等到某个异步操作返回结果后再允许再次触发fn函数useEffect(() > {document.addEventListener(LazShake.Event.onShakeOnce, () > {fn(listener);});}, []);useEffect(() > {setTim…

Kurento多对多webrtc会议搭建测试

环境ubuntu18.04 KMS版本6.13.0 多对多通信demo7.0.0 KMS运行起来后&#xff0c;通过运行它的一个个demo&#xff0c;来实现不同的功能&#xff0c;它的demo很多如下&#xff1a; https://github.com/Kurento 里面有一对一&#xff0c;多对多&#xff0c;还有一些特效的demo。…