pcl+vtk(七)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可直接设置属性

扫描二维码关注公众号,回复: 17203350 查看本文章

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

猜你喜欢

转载自blog.csdn.net/m0_67254672/article/details/133942602