为了方便观察图像的方向,位置以及旋转情况,想在窗口中添加一个坐标轴显示,并且这个坐标轴是随着窗口的旋转变动的,在网上找了很多例子,但是最后就是不显示坐标轴。
在此记录一下。
一、坐标轴相关类简单介绍
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被析够了。如果有知道的网友欢迎评论告知!