This is a note taken in Chinese recording my preparation for implementing final project of data science course Data Visualization. We aim to design a 3D human face free form deformation system. I’ll concentrate on implementing codes related to VTK
package and design the GUI.
The Visualization Toolkit (VTK) is an open-source, freely available software system for 3D computer graphics, image processing, and visualization. It’s a little bit difficult to learn how to use it since its document is not completed. I read some blogs as well as technical books, and take down some notes here.
VTK
VTK系统概述
渲染引擎
组成VTK渲染引擎的类主要负责接收可视化管线(Visualization Pipeline)的输出数据并将结果渲染到窗口中。
vtkProp
- 渲染场景中数据的可视表达(Visible Depictions)是由vtkProp的子类负责。
-
三维空间中渲染对象最常用的vtkProp子类是vtkActor和vtkVolume,其中vtkActor用于表示场景中的几何数据(Geometry Data),vtkVolume表示场景中的体数据(Volumetric Data)。
- vtkProp的子类负责确定场景中对象的位置、大小和方向信息。除了提供对象的位置信息控制之外,Prop内部通常还有两个对象,一个是Mapper对象,负责存放数据和渲染信息,另一个是Property对象,负责控制颜色、不透明度等参数。
- 注意:其中的有些Props内部直接包括了控制显示的参数和待渲染数据的索引,因此并不需要额外的Property和Mapper对象。
vtkAbsractMapper
- 许多Props,如vtkActor和vtkVolume利用vtkAbstractMapper的子类来保存输入数据的引用以及提供真正的渲染功能。
- vtkPolyDataMapper是渲染多边形几何数据主要的Mapper类。
- 对于体数据,VTK提供了多种渲染技术。例如,vtkFixedPointVolumeRayCastMapper用来渲染vtkImageData类型的数据,vtkProjectedTetrahedraMapper则是用来渲染vtkUnstructuredGrid类型的数据。
vtkProperty和vtkVolumeProperty
- 某些Props采用单独的属性对象来存储控制数据外观显示的参数,这样不同的对象可以轻松的实现外观参数的共享。
- vtkActor利用vtkProperty对象存储外观(属性)参数,如颜色、不透明度、材质的环境光(Ambient)系数、散射光(Diffuse)系数和反射光(Specular)系数等。
- vtkVolume则是采用vtkVolumeProperty对象来获取体对象的绘制参数,如将标量值映射为颜色和不透明度的传输函数(Transfer Function)。
vtkCamera
- vtkCamera存储了场景中的摄像机参数,换言之,如何来“看”渲染场景里的对象。
- 主要参数是摄像机的位置、焦点、和场景中的上方向向量。其他参数可以控制视图变换,如平行投影或者透视投影,图像的尺度或者视角,以及视景体的远近裁剪平面等。
vtkLight
- vtkLight对象主要用于场景中的光照计算,它存储了光源的位置和方向,以及颜色和强度等。
- 另外,还需要一个类型来描述光源相对于摄像机的运动。例如,HeadLight始终位于摄像机处,并照向焦点方向;而SceneLight则始终固定在场景中的某个位置。
vtkRenderer
- 组成场景的对象包括Prop,Camara和Light都被集中在一个vtkRenderer对象中。
- vtkRenderer负责管理场景的渲染过程。一个vtkRenderWindow中可以有多个vtkRenderer对象,而这些vtkRenderer可以渲染在窗口中不同的矩形区域中(视口),甚至可以是覆盖的区域。
vtkRendererWindow
- vtkRendererWindow将操作系统与VTK渲染引擎连接到一起。
- 不同平台下的vtkRendererWindow子类负责本地计算机系统中窗口创建和渲染过程的管理。
- vtkRendererWindow中包含了vtkRenderer的集合,以及控制渲染的参数,如立体显示(Stereo)、反走样、运动模糊(Motion Blur)和焦点深度(FocalDepth)。
vtkRenderWindowInteractor
- vtkRenderWindowInteractor负责监听鼠标、键盘和时钟消息,并通过VTK中的Command/Observer设计模式进行相应的处理。
- vtkInteractorStyle监听这些消息并进行处理以完成旋转、拉伸和放缩等运动控制。vtkRenderWindowInteractor自动建立一个默认的3D场景交互器样式(InteractorStyle)。
vtkTransform
- 场景中的许多对象,如Prop、光源Light、照相机Camera等都需要在场景中合理的放置,它们通过vtkTransform参数可以方便的控制对象的位置和方向。
- vtkTransform能够描述三维空间中的线性坐标变换,其内部表示为一个4×4的齐次变换矩阵。
- vtkTransform对象初始化为一个单位矩阵,你可以通过管线连接的方式将变换进行组合来完成复杂的变换。管线方式能够确保当其中任一个变换被修改时,其后续的变换都会相应的进行更新。
VTK基础
创建简单模型
使用VTK交互器
vtkRenderWindowInteractor
-
与数据进行交互最简单的方法就是实例化一个vtkRenderWindowInterator对象。该类会响应一系列预先设置的事件和动作,而且也提供了重载缺省动作的方法。
-
vtkRenderWindowInterator可以响应以下的渲染窗口事件。(一个渲染窗口可以关联多个渲染器,其中渲染器绘制在渲染窗口的视口里,交互器支持一个渲染窗口拥有多个渲染器。)
- 按键j和按键t—— joystick(位置敏感型)和trackball(动作敏感型)模式之间的切换。joystick模式下,只要鼠标按下动作就持续发生;trackball模式下,鼠标按下且移动时动作才产生。
- 按键c和按键a——相机和Actor(对象)模式之间的切换。相机模式下,鼠标事件对相机的位置和焦点起作用;对象模式下,鼠标事件作用于鼠标指针下的actor。
- 鼠标左键—— 相机模式下绕焦点旋转相机;对象模式下绕原点旋转actor。旋转方向是从渲染器视口的中心指向鼠标所在的位置。joystick模式下,旋转速度取决于鼠标的位置与视口中心的距离大小。
- 鼠标中键—— 相机模式下滚动中键可以实现相机镜头的拉伸(Pan);对象模式下中键可以平移actor。joystick模式下,镜头拉伸或平移的方由从视口中心指向鼠标所在的位置;trackball模式下,actor运动的方向与鼠标运动的方向一致。(注意:如果是两键鼠标,镜头的拉伸/对象的平移操作可以用按键
+鼠标左键完成。) - 鼠标右键—— 相机模式下可以实现相机镜头的拉伸(Zoom);对象模式下可以实现actor的缩放。按下鼠标右键且朝视口上半部分移动鼠标时,就是镜头的拉近/actor的放大;按下鼠标右键且朝视口的下半部分移动鼠标时,就是镜头的拉远/actor的缩小。joystick模式下,镜头拉伸的快慢或actor缩放速度取决于鼠标所在的位置与视口水平中心线的距离。
- 按键3—— 激活或关闭渲染窗口的立体模式(stereo mode)。缺省情况下,会创建红-蓝立体对(red-bluestereo pairs)。对一些支持Crystal Eyes LCD立体眼镜的,必须调用方法SetStereoToCrystalEyes()实现该功能。
- 按键e/q—— 退出应用程序。
- 按键f—— 移动actor到光标的当前的位置。设置当前光标所在的位置为焦点,而且会以该点为旋转中心。
- 按键p—— 执行拾取(pick)操作。渲染窗口交互器内部有一个vtkPropPicker实例,可实现拾取功能。详细内容参考本章“拾取”一节。
- 按键r—— 沿当前视场的方向重置相机。移动相机和actor使所有的对象都可见。
- 按键s—— 改变所有actor的显示形式为表面模型。
- 按键u—— 调用用户自定义方法。(在Tcl/Tk脚本程序下)通常会弹出交互窗口,可以输入命令进行交互。
- 按键w—— 改变所有actor的显示形式为线框模型。
-
默认的交互风格是位置敏感型(即joystick模式),也就是说,只要鼠标按下就可以持续控制相机或actor以及渲染器。
Filtering Data
- Filter的连接可以通过方法SetInputConnection()和GetOutputPort()。
- 当管线里的Source或者Filter输出的数据类型与下一个Filter或Mapper的输入类型一致,就说输入和输出的类型是匹配的。输出的数据类型除了要与输入的匹配,还必须与输入的子类的类型匹配。
控制相机
控制光照
控制3D Props
- VTK中的渲染窗口渲染的对象通常称之为Prop。VTK里有几种不同类型的Prop,包括vtkProp3D和vtkActor。其中vtkProp3D是一个抽象父类,表示的是三维场景中的对象;vtkActor是vtkProp3D的子类,用类似多边形(Polygon)和线(Lines)等基本数据来定义它的几何。
Actors
- vtkActor提供了一组渲染属性,如表面属性(如环境光、散射光和镜面光颜色),显示形式(Representation)(如表面模型或线框模型),纹理映射以及几何定义(即mapper)。
- 重要:Actor的属性中关于颜色的设置只有当Actor的Mapper没有标量数据(ScalarData)时才起作用。缺省情况下,Mapper输入的标量数据会对Actor进行着色,而Actor的颜色设置会被忽略。如果要忽略这些标量数据,可以使用方法ScalarVisibilityOff()。