(七)QVTKOpenGLNativeWidget中显示坐标轴

编程入门 行业动态 更新时间:2024-10-12 08:21:07

(七)QVTKOpenGLNativeWidget中显示<a href=https://www.elefans.com/category/jswz/34/1754383.html style=坐标轴"/>

(七)QVTKOpenGLNativeWidget中显示坐标轴

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

在此记录一下。

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

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_OBJECTpublic: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被析够了。如果有知道的网友欢迎评论告知!

更多推荐

(七)QVTKOpenGLNativeWidget中显示坐标轴

本文发布于:2023-12-06 22:12:53,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1669113.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:坐标轴   QVTKOpenGLNativeWidget

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!