【QT+VTK 学习笔记】01:绘制圆柱体数据模型

前言

“VTK图形图像开发进阶_张晓东_罗火灵”的学习笔记。
东灵工作室 教程系列导航:http://blog.csdn.net/www_doling_net/article/details/8763686
【QT+VTK 学习笔记专栏】

学习资料

VTK8.2.0+QT5+VS2015 x86/x64 已编译第三方库以其测试DEMO:
https://download.csdn.net/download/qq_37373742/83350761?spm=1001.2014.3001.5503

VTK官网学习地址:https://vtk.org/doc/nightly/html/

程序展示

【QT+VTK 学习笔记】01:绘制圆柱体数据模型_第1张图片

学习笔记

vtkSmartPointer 智能指针
使用智能指针,用户不必考虑何时进行内存释放,而是由智能指针进行控制。

vtkCylinderSource 生成多边形数据模型
该类派生自vtkPolyDataAlgorithmo顾名思义,vtkCylinderSource生成的数据类型就是 vtkPolyData,它主要是生成一个中心在渲染场景原点的柱体,柱体的长轴沿着Y轴,柱体的 高度、截面半径等都可以任意指定。

vtkCylinderSource::SetHeight():设置柱体的高。
vtkCylinderSource::SetRadius():设置柱体横截面的半径。
vtkCylinderSource::SetResolution():设置柱体横截面的等边多边形的边数。转动一下柱体, 然后数一数柱体横截面有多少条边,应该就能明白这个参数所裏示的意思。

vtkPolyDataMapper 将几何数据转换为可被渲染引擎绘制的可视化表达
VtkPolyDataMapper:: SetInputConnection (): VTK可视化线的输入数据接口,对应的输出数据可视化管道接口为GetOutputPort ();

cylinderMapper->SetInputConnection(cylinder->GetOutputPort());

vtkActor 需要被渲染绘制的对象
该类派生自vtkProp类,渲染场景中数据的可视化表达通过vtkProp的子类负责。比如该 示例要渲染一个柱体,柱体的数据类型是vtkPolyData,数据要在场景中渲染时,不是直接把 数据加入渲染场景,而是以vtkProp的形式存在于渲染场景中。三维空间中渲染对象最常用的 vtkProp子类有vtkActor (表达场景中的几何数据)和vtkVolume (表达场景中的体数据); 二维空间中的数据则是用vtkActor2D表达:vtkProp子类负责确定渲染场景中对象的位置、大 小和方向等信息;Prop依赖于两个对象:一个是Mapper (vtkMapper)对象,负责存放数据 和渲染信息;另一个是属性(vtkProperty)对象,负责控制颜色、不透明度等参数。另外, vtkActor中还可以设置纹理(vtkTexture)对象,用于纹理贴图。

vtkRenderWindow 渲染窗口
将操作系统与VTK渲染引擎连接到一起。不同平台下的vtkRenderWindow子类负责管理 本地计算机系统中窗口创建和渲染过程。当使用VTK开发应用程序时,只需要使用平台无关 的vtkRendererWindow类,运行时,系统会自动替换为平台相关的vtkRendererWindow子类。 比如,Windows下运行上述的VTK程序,实际创建的是vtkWin32OpenGLRenderWindow (vtkRenderWindow 的子类)对象。vtkRenderWindow 中包含了 vtkRenderer 集合、渲染参数, 如立体显示(Stereo)、反走样、运动模糊(Motion Blur)和焦点深度(Focal Depth)等。

vtkRenderer 负责管理场景的渲染过程
组成场景的 对象包括Prop,照相机(vtkCamera)和光照 (vtkLight)都被整合到一个vtkRenderer对象中。一个vtkRenderWindow中可以有多个 vtkRenderer对象,而这些vtkRenderer可以渲染在窗口不同的矩形区域中(即视口)或者覆盖 整个窗口区域。

vtkRenderer::AddActor():
该方法用于将vtkProp类型的对象添加到渲染场景中。

vtkRenderer::SetBackground():
该方法是从 vtkRenderer 的父类 vtkViewport 继承的,用于 设置渲染场景的普景颜色,用R、G、B的格式设置,三个分量的取值为0.01.0(0.0, 0.0, 0.0)为黑色,(1.0, 1-0, 1.0)为白色。除了可以设置单一的背景颜色之外,还可以设置渐变的 背景颜色,

vtkVieWport::SetBackground2()
用于设置渐变的另外一种颜色,但是要使背景颜色 渐变生效或者关闭,必须调用以下的方法。

vtkViewport::SetGradientBackground(bool):
参数为 0 时,关闭,反之,打开。

vtkViewport::GradientBackgroundOn():
该方法用于打开背景颜色渐变效果,相当于调用 方法 SetGradientBackground(l)
。
vtkViewport::GradientBackgroundOff():
该方法用于关闭背景颜色渐变效果。相当于调用 方法 SetGradientBackground(0)

vtkRenderWindowInteractor 交互器
vtkRenderWindowInteractor用于获取渲染窗口上发生的鼠标,键盘,事件事件。该类提供了独立于平台的与渲染窗口进行交互的机制,包括picking 和帧速率控制。
当vtkRenderWindowInteractor(事实上是他的一个子类)观察到平台的某个事件发生时,他就通过InvokeEvent()方法把该事件转换为VTK事件。该类作为某些具体平台的基类来控制鼠标/键盘/时间消息的传送,通知vtkInteractorObserver和它的子类。注册于该交互器的所有观察者对象vtkInteractorObservers 都会接受到该事件,然后都对该事件进行响应。

vtkrenderwindowwinteractor:: SetRenderWindow():
这个方法是用来设置颜色窗口的,消息被传递,捕获渲染窗口,所以必须给交互对象,设置颜色窗口。

vtkrenderwindowwinteractor:: SetInteractorStyle():
该方法用于定vtkInteractorStyleSwitch的交互样式和默认交互样式。

VtkRenderWindowInteractor:: Initialize():
这个方法据说是为事件处理窗口做准备,交互设备工作前必须初始化调用这个方法。

vtkrenderwindowwinteractor:: Start():
这个方法是说开始进入事件响应周期,交互处于等待状态,等待用户交互事件。在进入事件响应周期之前,必须调用Initialize()方法。

vtkInteractorStyleTrackballCamera 交互方式
交互器样式的一种。该样式下,用户通过控制相机对物体作旋转、放大、缩小等操作。 打个比方,在照相时如果要想物体拍起来显得大一些,可以采取两种做法:第一种做法是相 机不动,让要拍的物体靠近相机;第二种做法是物体不动,让相机靠近物体。第二种做法就 是 vtklnteractorStyleTrackballCamera 的风格。其父类为 vtklnteractorStyle.除了 vtkinteractor StyleTrackballCamera 之外,VTK 还定义了其他多种交互器样式,如 vtklnteractorStylelmage, 主要用于显示二维图像时的交互。

举例理解

可以将该示例看作一个舞台剧演出。观看舞台剧时,观众坐在台下,展现在观众面前 的是一个舞台,舞台上有各式的灯光和各样的演员。演员出场时肯定是会先化妆,观众有时 还会与台上的演员有一定的互动。
整个剧院就好比VTK程序的渲染窗口(vtkRenderWindow);舞台就相当于渲染场景 (vtkRenderer):而那些演员就是程序中的Actor,台上演员与台下观众的互动可以看作与应 用程序的交互(vtkRenderWindowlnteractor);演员与观众的互动方式有很多种,现场的观众 可以直接上台跟演员们握手拥抱,电视机前的可以发短信,计算机前的可以微博关注等,这 就好比程序中的交互器样式(vtklnteractorStyle):对于舞台上的演员,观众都可以一一分辨出来,不会弄混,是因为他们穿着打扮、容貌都不一样,这就相当于程序中vtkActor的不同 属性(vtkProperty);台下观众的眼睛可以看作vtkCamera,前排的观众因为离得近,在观看 台上演员时会觉得他们比较高大,而后排的观众因为离得远,所以那些演员看起来就会显得 小些,每位观众看到的东西在他/她的世界里都是唯一的,所以渲染场景Renderer里的 vtkCamera对象也是只有一个;舞台上的灯光可以有多个,所以渲染场景里的vtkLight也存在多个。可以参考下图以加深理解。
【QT+VTK 学习笔记】01:绘制圆柱体数据模型_第2张图片
【QT+VTK 学习笔记】01:绘制圆柱体数据模型_第3张图片

程序源码

#include 
#include 
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)

#include "vtkCylinderSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include "vtkInteractorStyleTrackballCamera.h"

int main()
{
  // 圆柱体数据模型
  vtkCylinderSource *cylinder = vtkCylinderSource::New();
  cylinder->SetResolution(8);

  // 将几何数据转换为可被渲染引擎绘制的可视化表达
  vtkPolyDataMapper *cylinderMapper = vtkPolyDataMapper::New();
  //VtkPolyDataMapper:: SetInputConnection (): VTK可视化线的输入数据接口,对应的输出数据可视化管道接口为GetOutputPort ();
  cylinderMapper->SetInputConnection(cylinder->GetOutputPort());

  // 需要被渲染绘制的对象
  vtkActor *cylinderActor = vtkActor::New();
  cylinderActor->SetMapper(cylinderMapper);
  cylinderActor->GetProperty()->SetColor(1.0000, 0.3882, 0.2784);
  cylinderActor->RotateX(30.0);
  cylinderActor->RotateY(-45.0);

  // 渲染器 渲染窗口 交互器
  vtkRenderer *renderer = vtkRenderer::New();
  vtkRenderWindow *renWin = vtkRenderWindow::New();
  renWin->AddRenderer(renderer);
  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
  iren->SetRenderWindow(renWin);

  // 交互方式
  vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();
  iren->SetInteractorStyle(style);

  // 将需要被渲染的对象添加到渲染器
  renderer->AddActor(cylinderActor);
  renderer->SetBackground(0.1, 0.2, 0.4);
  renWin->SetSize(200, 200);

  // 设置用于观察场景的相机
  renderer->ResetCamera();
  renderer->GetActiveCamera()->Zoom(1.5);
  renWin->Render();

  // 开始渲染 进入事件循环
  iren->Start();
  // 清除实例
  cylinder->Delete();
  cylinderMapper->Delete();
  cylinderActor->Delete();
  renderer->Delete();
  renWin->Delete();
  iren->Delete();
  style->Delete();
  return 0;
}

你可能感兴趣的:(QT+VTK学习笔记,qt,图像处理,ui)