坐标轴"/>
(七)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中显示坐标轴
发布评论