一个稍微复杂的VTK程序
3、VTK基础概念
在第2章里,我们已经接触了一个简单的VTK工程,也掌握了怎么使用CMake来构建VTK工程的步骤,本书后续章节的所有例子都是采用第2章介绍的步骤来构建VTK的工程。
本章我们先在第2章TestVTKInstall的基础上作一些更改,演示一个能够交互的VTK应用程序。与前面的风格类似,我们先是让你“知其然”,然后再慢慢地让你“知其所以然”。
3.1 一个稍微复杂的VTK程序
首先当然是写一个CMakeLists.txt文件。在D:\Toolkits\VTK\Examples\下新建一个文件夹,名为3.1.1_RenderCylinder,在该目录下新建CMakeLists.txt和RenderCylinder.cpp文件。
示例3.1.1_RenderCylinder的CMakeLists.txt |
1: cmake_minimum_required(VERSION 2.8)
5: add_executable(${PROJECT_NAME} RenderCylinder.cpp)
6: target_link_libraries(${PROJECT_NAME} ${VTK_LIBRARIES})
示例3.1.1_RenderCylinder |
1: #include "vtkSmartPointer.h"
2: #include "vtkRenderWindow.h"
4: #include "vtkRenderWindowInteractor.h"
5: #include "vtkInteractorStyleTrackballCamera.h"
6: #include "vtkCylinderSource.h"
7: #include "vtkPolyDataMapper.h"
12: vtkSmartPointer<vtkCylinderSource> cylinder =
13: vtkSmartPointer<vtkCylinderSource>::New();
14: cylinder->SetHeight( 3.0 );
15: cylinder->SetRadius( 1.0 );
16: cylinder->SetResolution( 10 );
18: vtkSmartPointer<vtkPolyDataMapper> cylinderMapper =
19: vtkSmartPointer<vtkPolyDataMapper>::New();
20: cylinderMapper->SetInputConnection( cylinder->GetOutputPort() );
22: vtkSmartPointer<vtkActor> cylinderActor =
23: vtkSmartPointer<vtkActor>::New();
24: cylinderActor->SetMapper( cylinderMapper );
26: vtkSmartPointer<vtkRenderer> renderer =
27: vtkSmartPointer<vtkRenderer>::New();
28: renderer->AddActor( cylinderActor );
29: renderer->SetBackground( 0.1, 0.2, 0.4 );
31: vtkSmartPointer<vtkRenderWindow> renWin =
32: vtkSmartPointer<vtkRenderWindow>::New();
33: renWin->AddRenderer( renderer );
34: renWin->SetSize( 300, 300 );
36: vtkSmartPointer<vtkRenderWindowInteractor> iren =
37: vtkSmartPointer<vtkRenderWindowInteractor>::New();
38: iren->SetRenderWindow(renWin);
40: vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
41: vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
42: iren->SetInteractorStyle(style);
图3.1 示例3.1.1_RenderCylinder的运行结果
vtkCylinderSource::SetHeight() ——设置柱体的高。
vtkCylinderSource::SetRadius() ——设置柱体横截面的半径。
vtkCylinderSource::SetResolution() ——设置柱体横截面的等边多边形的边数。转动一下柱体,然后数数柱体横截面有多少条边,应该就能明白这个参数表示什么意思。
(2) vtkPolyDataMapper:(第18-20行),渲染多边形几何数据(vtkPolyData),派生自类vtkMapper,将输入的数据转换为几何图元(点、线、多边形)进行渲染。
vtkActor::SetMapper()——设置生成几何图元的Mapper。即连接一个Actor到可视化管线的末端(可视化管线的末端就是Mapper)。
vtkRenderWindow::AddRenderer() ——加入vtkRenderer对象。
vtkRenderWindow::SetSize() ——该方法是从vtkRenderWindow的父类vtkWindow继承过来的,用于设置窗口的大小,以像素为单位。
vtkRenderer::AddActor() ——添加vtkProp类型的对象到渲染场景中。
vtkViewport::SetGradientBackground(bool) ——参数为0是关闭,反之,打开。
vtkViewport::GradientBackgroundOn()—— 打开背景颜色渐变效果,相当于调用方法SetGradientBackground(1)。
vtkViewport::GradientBackgroundOff() ——关闭背景颜色渐变效果。相当于调用方法SetGradientBackground(0)。
(6) vtkRenderWindowInteractor:(第36-38行),提供平台独立的响应鼠标、键盘和时钟事件的交互机制,通过VTK的Command/Observer设计模式将监听到的特定平台的鼠标、键盘和时钟事件交由vtkInteractorObserver或其子类,如vtkInteractorStyle进行处理。vtkInteractorStyle等监听这些消息并进行处理以完成旋转、拉伸和放缩等运动控制。vtkRenderWindowInteractor自动建立一个默认的3D场景交互器样式(Interactor Style):vtkInteractorStyleSwitch,当然你也可以选择其他的交互器样式,或者是创建自己的交互器样式。在本例中,我们就是选择了其他的交互器样式来替代默认的:vtkInteractorStyleTrackballCamera。
vtkRenderWindowInteractor::SetRenderWindow()——设置渲染窗口,消息是通过渲染窗口捕获到的,所以必须要给交互器对象设置渲染窗口。
vtkRenderWindowInteractor::SetInteractorStyle()——定义交互器样式,默认的交互样式为vtkInteractorStyleSwitch。
vtkRenderWindowInteractor::Initialize() ——为处理窗口事件做准备,交互器工作之前必须先调用这个方法进行初始化。
vtkRenderWindowInteractor::Start() ——开始进入事件响应循环,交互器处于等待状态,等待用户交互事件的发生。进入事件响应循环之前必须先调用Initialize()方法。
3.2 vtkActor及相关属性
由前面的内容我们知道,数据渲染时不是直接加入渲染场景,而是以vtkProp的形式存在的,因此有必要再详细讨论一下vtkProp及其子类,图3.3为vtkProp类的继承图。
图3.3 类vtkProp的继承图
3.2.1vtkProp和vtkProp3D
SetVisibility(int) / GetVisibility () /VisibilityOn () /VisibilityOff ()
Pick () / SetPickable (int) / GetPickable () / PickableOn() / PickableOff ()
SetDragable (int) / GetDragable () / DragableOn () /DragableOff()
l SetScale (double) / GetScale ():设置/获取各向同性的缩放比例。
l SetScale (double, double,double) / GetScale (double):设置/获取各同异性的缩放比例。
l RotateX (double) / RotateY (double) / RotateZ (double):分别绕X、Y、Z轴旋转指定角度。
l AddOrientation (double, double,double):在vtkProp3D对象的当前方向增加一个给
l SetPosition (double, double,double) / GetPosition ():在世界坐标系下,指定/获取vtkProp3D对象的位置。
l AddPosition (double, double,double):在vtkProp3D对象的当前位置增加一个偏移。
l SetOrigin (double, double,double ) / GetOrigin ():设置/获取vtkProp3D对象的原点。
3.2.2vtkActor及其属性
前面的内容已经提到:Prop依赖于两个对象,一个是Mapper(vtkMapper)对象,负责存放数据和渲染信息,另一个是属性(vtkProperty)对象,负责控制颜色、不透明度等参数。对应的这两个方法就是在类vtkActor里定义的:
l SetMapper (vtkMapper *):设置定义Actor几何形状的Mapper。
l SetProperty (vtkProperty *):设置Actor的属性,包括表面属性,如环境光(Ambient)、散射光(Diffuse)、镜面光(Specular)、颜色、透明度等;纹理映射;点的大小,线的宽度设置等。每一个Actor都有一个属性对象(vtkProperty的实例)与之相关联,如果没有给Acttor指定相应的属性(3.1.1的例子就没有指定),VTK会指定默认的属性对象。多个Actor可以共享一个属性对象。请看以下的代码:
//控制Actor属性方法一:先获取Actor的Property对象,然后设置对应的参数。
//调用以下方法时,应该先包括头文件:#include“vtkProperty.h”
//改变cylinderActor颜色为红色,可以直接调用SetColor(),也可调用SetDiffuseColor()。
cylinderActor->GetProperty()->SetColor(1.0,0.0,0.0);
//cylinderActor->GetProperty()->SetDiffuseColor(1.0,0.0,0.0);
//控制Actor属性的方法二:先实例化vtkProperty对象,然后加入到Actor里。
vtkSmartPointer<vtkProperty>cylinderProperty = vtkSmartPointer<vtkProperty>::New();
cylinderProperty->SetColor(1.0,0.0,0.0);
cylinderActor->SetProperty(cylinderProperty);
接着,我们看看怎么使用vtkProperty给Actor贴纹理图(与纹理图相关的类:vtkTexture),我们在以上例子的基础上作一下修改,在柱体上贴一个图。
//在3.1.1_RenderCylinder程序的最开始加入下列的代码
vtkSmartPointer<vtkBMPReader>bmpReader = vtkSmartPointer<vtkBMPReader>::New();
bmpReader->SetFileName("doling.bmp");
vtkSmartPointer<vtkTexture>texture = vtkSmartPointer<vtkTexture>::New();
texture->SetInputConnection(bmpReader->GetOutputPort());
cylinderActor->SetTexture(texture);
图3.4 使用vtkProperty和vtkTexture给Actor贴纹理图
==========欢迎转载,转载时请保留该声明信息==========
版权归@东灵工作室所有,更多信息请访问东灵工作室
教程系列导航:http://blog.csdn.net/www_doling_net/article/details/8763686
================================================
一个稍微复杂的VTK程序相关推荐
- Vulkan是什么?和我一起完成一个简单的Vulkan应用程序
在本章,你将学到: Vulkan以及它背后的基本原理: 如何创建一个最简单的Vulkan应用程序: 在本书其余部分将使用到的术语和概念. 本章将介绍并解释Vulkan是什么.我们会介绍API背后的基本 ...
- 一个毕业6年的程序员工作经历和成长感悟(终)
接上篇:一个毕业6年的程序员工作经历和成长感悟(上) 一个毕业6年的程序员工作经历和成长感悟(中) 一个毕业6年的程序员工作经历和成长感悟(下) 回望过去6年的经历,自己有了很多变化:从表面上来说,工 ...
- 一个三流院校毕业的程序员奋斗历程
这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微薄的力量.最近看到很多学生朋友和我当年一样没有方向 ,所以把我的经历写出来与大家共勉,希望能 ...
- 一个完整的Installshield安装程序实例—艾泽拉斯之海洋女神出品(三) --高级设置一...
一个完整的Installshield安装程序实例-艾泽拉斯之海洋女神出品(三) --高级设置一 原文:一个完整的Installshield安装程序实例-艾泽拉斯之海洋女神出品(三) --高级设置一 上 ...
- 【 C 】简化双链表插入函数(对在双链表中插入一个新值的简明程序的简化)
目录 背景 第一个技巧是语句提炼(statement factoring) 第二个简化技巧 最终简化版本 背景 上篇博文:[ C ]在双链表中插入一个新值的简明程序,讲了一个简明的双链表插入函数,那个 ...
- Windows下编译TensorFlow1.3 C++ library及创建一个简单的TensorFlow C++程序
参考:https://www.cnblogs.com/jliangqiu2016/p/7642471.html Windows下编译TensorFlow1.3 C++ library及创建一个简单的T ...
- python软件代码示例-用Python写一个模拟qq聊天小程序的代码实例
Python 超简单的聊天程序 客户端: import socket, sys host = '10.248.27.23' # host = raw_input("Plz imput des ...
- 安装汇编环境,写一个最简单的窗口程序
用汇编写一个窗口程序 1.安装汇编所需的环境 1.下载masm32 下载地址 可以安装到D:\masm32目录下 2.配置环境变量 include = D:\masm32\include lib = ...
- 为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要1...
为什么80%的码农都做不了架构师?>>> 为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要10k的薪水? 由于目前国内嵌入 ...
最新文章
- Java 中的关键字 final
- KVM创建虚拟机(六)
- 如何基于K8s构建下一代DevOps平台?
- 由铁路订票系统联想到的
- 重操JS旧业第十一弹:BOM对象
- docker源码_使用docker、Jenkins、gitlee、springboot、搭建个人博客网站 并实现CI/CD 外加机器人提醒...
- 【树莓派学习笔记】一、烧录系统、(无屏幕)配置Wifi和SSH服务
- 〖Android〗屏幕触屏事件录制与回放
- C++STL库中的map容器
- 如何elf文件转换为asm汇编文件
- JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
- html英雄联盟网页,Html+Css+JQuery实现简易英雄联盟官网
- 13家著名IT公司logo变迁史
- 利用ACC控制酷狗音乐
- 在电脑双屏使用时,搜狗输入法在别的屏幕(转)
- mysql关闭空闲连接_终止空闲的mysql连接
- 从源码解析-Android系统启动流程概述 init进程zygote进程SystemServer进程启动流程
- 关于负数在计算机中的表示方法
- 思迈特Smartbi数据填报功能
- 00-前端开发和前端开发工具