前言
“VTK先进的图形图像开发_张晓东_学习笔记罗火灵。 东灵工作室 教程系列导航:http://blog.csdn.net/www_doling_net/article/details/8763686 【QT VTK 学习笔记专栏】
学习资料
程序展示
学习笔记
使用智能指针,用户不必考虑何时释放内存,而是由智能指针控制。
该类派生自vtkPolyDataAlgorithmo顾名思义,vtkCylinderSource生成的数据类型是 vtkPolyData,它主要生成一个中心在渲染场景原点的柱体,沿Y轴和柱体的长轴 可任意指定高度、截面半径等。
vtkCylinderSource::SetHeight():设置柱体的高度。 vtkCylinderSource::SetRadius():设置柱横截面的半径。 vtkCylinderSource::SetResolution():设置柱横截面等边多边形边数。旋转柱, 然后数一数柱的横截面有多少条边,你应该能够理解参数的含义。
VtkPolyDataMapper:: SetInputConnection (): VTK可视化线的输入数据接口,对应的输出数据可视化管道接口为GetOutputPort ();
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
该类派生自vtkProp类、渲染场景中数据的可视化表达vtkProp子类负责。比如该 例子是渲染柱,柱的数据类型是vtkPolyData,当场景中渲染数据时,不要直接渲染 数据添加到渲染场景中,而是添加到渲染场景中vtkProp的形式存在于渲染场景中。渲染对象在三维空间中最常用 vtkProp子类有vtkActor (表达场景中的几何数据)和vtkVolume (表达场景中的体数据); 使用二维空间中的数据vtkActor2D表达:vtkProp子类负责确定渲染场景中物体的位置 小和方向等信息;Prop依赖两个对象:一个是Mapper (vtkMapper)对象,负责存储数据 另一个是属性(vtkProperty)对象负责控制颜色、不透明度等参数。另外, vtkActor纹理也可以设置在中间(vtkTexture)对象,用于纹理贴图。
将操作系统与VTK渲染引擎连接在一起。在不同的平台下vtkRenderWindow管理子类 在本地计算机系统中创建和渲染窗口。当使用VTK开发应用程序时,只需要使用平台无关 的vtkRendererWindow类、运行时,系统会自动替换为平台相关vtkRendererWindow子类。 比如,Windows下操作上述VTK实际创建的程序是vtkWin32OpenGLRenderWindow (vtkRenderWindow 子类)对象。vtkRenderWindow 中包含了 vtkRenderer 收集、渲染参数, 如立体显示(Stereo)、反走样,运动模糊(Motion Blur)和焦点深度(Focal Depth)等。
组成场景的 对象包括Prop,照相机(vtkCamera)和光照 (vtkLight)整合成一个vtkRenderer对象中vtkRenderWindow中可以有多个 vtkRenderer对象,而这些vtkRenderer可渲染在窗口不同的矩形区域(即视口)或覆盖 整个窗口区域。
vtkRenderer::AddActor(): 该方法用于将vtkProp将类型对象添加到渲染场景中。 vtkRenderer::SetBackground(): 该方法是从 vtkRenderer 的父类 vtkViewport 用于继承 设置渲染场景的普景色,使用R、G、B三个重量的格式设置为0.0?1.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用于获取渲染窗口上发生的鼠标,键盘,事件事件。该类提供了独立于平台的与渲染窗口进行交互的机制,包括picking 和帧速率控制。 当vtkRenderWindowInteractor(事实上是他的一个子类)观察到平台的某个事件发生时,他就通过InvokeEvent()方法把该事件转换为VTK事件。该类作为某些具体平台的基类来控制鼠标/键盘/时间消息的传送,通知vtkInteractorObserver和它的子类。注册于该交互器的所有观察者对象vtkInteractorObservers 都会接受到该事件,然后都对该事件进行响应。
vtkrenderwindowwinteractor:: SetRenderWindow():
这个方法是用来设置颜色窗口的,消息被传递,捕获渲染窗口,所以必须给交互对象,设置颜色窗口。
vtkrenderwindowwinteractor:: SetInteractorStyle():
该方法用于定vtkInteractorStyleSwitch的交互样式和默认交互样式。
VtkRenderWindowInteractor:: Initialize():
这个方法据说是为事件处理窗口做准备,交互设备工作前必须初始化调用这个方法。
vtkrenderwindowwinteractor:: Start():
这个方法是说开始进入事件响应周期,交互处于等待状态,等待用户交互事件。在进入事件响应周期之前,必须调用Initialize()方法。
交互器样式的一种。该样式下,用户通过控制相机对物体作旋转、放大、缩小等操作。 打个比方,在照相时如果要想物体拍起来显得大一些,可以采取两种做法:第一种做法是相 机不动,让要拍的物体靠近相机;第二种做法是物体不动,让相机靠近物体。第二种做法就 是 vtklnteractorStyleTrackballCamera 的风格。其父类为 vtklnteractorStyle.除了 vtkinteractor StyleTrackballCamera 之外,VTK 还定义了其他多种交互器样式,如 vtklnteractorStylelmage, 主要用于显示二维图像时的交互。
举例理解
可以将该示例看作一个舞台剧演出。观看舞台剧时,观众坐在台下,展现在观众面前 的是一个舞台,舞台上有各式的灯光和各样的演员。演员出场时肯定是会先化妆,观众有时 还会与台上的演员有一定的互动。 整个剧院就好比VTK程序的渲染窗口(vtkRenderWindow);舞台就相当于渲染场景 (vtkRenderer):而那些演员就是程序中的Actor,台上演员与台下观众的互动可以看作与应 用程序的交互(vtkRenderWindowlnteractor);演员与观众的互动方式有很多种,现场的观众 可以直接上台跟演员们握手拥抱,电视机前的可以发短信,计算机前的可以微博关注等,这 就好比程序中的交互器样式(vtklnteractorStyle):对于舞台上的演员,观众都可以一一分辨出来,不会弄混,是因为他们穿着打扮、容貌都不一样,这就相当于程序中vtkActor的不同 属性(vtkProperty);台下观众的眼睛可以看作vtkCamera,前排的观众因为离得近,在观看 台上演员时会觉得他们比较高大,而后排的观众因为离得远,所以那些演员看起来就会显得 小些,每位观众看到的东西在他/她的世界里都是唯一的,所以渲染场景Renderer里的 vtkCamera对象也是只有一个;舞台上的灯光可以有多个,所以渲染场景里的vtkLight也存在多个。可以参考下图以加深理解。
程序源码
#include <QApplication>
#include <vtkAutoInit.h>
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;
}