本文翻译自VTK user guide.
VTK渲染引擎由VTK中的类组成,这些类负责获取可视化管道的结果并将其显示到窗口中。这涉及以下组件。注意,这并不是一个完备的列表,而是渲染引擎中最常用对象的含义。这里使用的副标题是VTK中表示这种类型对象的最高级别超类,都是抽象类;大多数情况下有多种选择;这些抽象类定义了实现该功能的各种具体子类的基本API。
vtkProp. 场景中存在的数据的可见描述由vtkProp的子类表示。vtkProp中用于在3D中显示对象的最常用子类是vtkActor(用于表示场景中的几何数据)和vtkVolume(用于表示场景中的体积数据)。还有一些在2D中表示数据的道具,如vtkActor2D。vtkProp子类通常负责了解其在场景中的位置、大小和方向。用于控制道具放置的参数通常取决于道具是场景中的三维对象还是二维注释。对于vtkActor和vtkVolume等3D Prop(vtkProp3D的两个子类,它本身就是vtkProp的子类),可以直接控制对象的3D位置、方向和比例等参数,也可以使用4x4变换矩阵。对于提供注释的2D Prop(如VTKScalArbarator),可以通过多种方式定义注释的大小和位置,包括指定相对于整个视口大小的位置、宽度和高度。除了提供放置控制之外,道具通常还有一个保存数据并知道如何渲染数据的映射器对象,以及一个控制颜色和不透明度等参数的属性对象。
有超过50个专门的道具,例如vtkImageActor用于显示图像,vtkPieChartActor用于创建数值数组的饼图视觉表示。其中一些专用道具直接包含控制外观的参数,并直接引用要渲染的输入数据,因此不需要使用属性或映射器。vtkFollower道具是vtkActor的一个特殊子类,它将自动更新其方向,以便连续面对指定的摄影机。这对于在3D场景中显示广告牌或文本以及在用户旋转时使其保持可见非常有用。vtkLODActor也是vtkActor的一个子类,它自动更改其几何表示以保持交互式帧速率,而vtkLODProp3D是vtkProp3D的一个子类,它在多个不同的映射器,甚至可能是体映射器和几何映射器的混合,之间进行选择以提供交互。VTKAssembly允许角色的层次结构,在层次结构被平移、旋转或缩放时,可以正确管理转换。
vtkAbstractMapper. 有些道具,如vtkActor和vtkVolume,使用vtkAbstractMapper的子类来保存对输入数据的引用,并提供实际的渲染功能。vtkPolyDataMapper是渲染多边形几何体的主要映射器。对于体积对象,VTK提供了几种渲染技术,包括可用于渲染vtkImageData的vtkFixedPointVolumeRayCastMapper,以及可用于渲染vtkUnstructuredGrid数据的vtkProjectedTetrahedra映射器。
vtkProperty and vtkVolumeProperty. 一些道具使用单独的属性对象来保存控制数据外观的各种参数。这可以更轻松地在场景中的不同对象之间共享外观设置。vtkActor对象使用vtkProperty存储诸如颜色、不透明度以及材质的环境光、漫反射和镜面反射系数等参数。vtkVolume对象使用vtkVolumeProperty来捕获适用于体积对象的参数,例如将标量值映射到颜色和不透明度的传递函数。许多映射器还提供设置可用于显示内部结构的剪裁平面的功能。
vtkCamera. vtkCamera包含控制如何查看场景的参数。vtkCamera有一个位置、一个焦点和一个定义场景中“向上”方向的向量。其他参数控制特定的查看变换(平行或透视)、图像的比例或视角以及视锥体的近剪裁平面和远剪裁平面。
vtkLight. 为场景计算照明时,需要一个或多个vtkLight对象。vtkLight对象存储灯光的位置和方向,以及颜色和强度。灯光还有一种类型,描述灯光将如何相对于相机移动。例如,前照灯始终位于摄影机的位置并照射在摄影机的焦点上,而场景灯位于场景中的固定位置。
vtkRenderer. 构成场景的对象(包括道具、相机和灯光)收集在vtkrender中。vtkRenderer负责管理场景的渲染过程。多个vtkRenderer对象可以在单个vtkRenderWindow中一起使用。这些渲染器可以渲染到渲染窗口的不同矩形区域(称为视口),也可以重叠。
vtkRenderWindow. vtkRenderWindow提供操作系统和VTK渲染引擎之间的连接。vtkRenderWindow的特定于平台的子类负责在计算机上的本机窗口系统中打开窗口并管理渲染过程。使用VTK开发时,只需使用独立于平台的vtkRenderWindow,该窗口在运行时会自动替换为正确的特定于平台的子类。vtkRenderWindow包含vtkRenderer的集合,以及控制渲染功能(如立体、抗锯齿、运动模糊和焦距)的参数。
vtkRenderWindowInteractor. VTKrenderWindowInteractior负责处理鼠标、键和计时器事件,并通过VTK的命令/观察者设计模式实现这些事件。vtkInteractorStyle侦听并处理这些事件,以便提供旋转、平移和缩放等运动控制。vtkRenderWindowInteractior会自动创建一个默认的Interactior样式,该样式适用于3D场景,但您可以选择一个用于查看2D图像,或者创建自己的自定义Interactior样式。
vtkTransform. 场景中需要放置的许多对象(如道具、灯光和摄影机)都具有vtkTransform参数,可用于轻松操纵对象的位置和方向。VTK变换可用于描述三维线性(也称为仿射)坐标变换的全范围,其内部表示为4x4齐次变换矩阵。vtkTransform对象将以默认的标识矩阵开始;也可以以管道方式将转换链接在一起,以创建复杂的行为。管道机制确保,如果修改管道中的任何变换,所有后续变换都会相应更新。
vtkLookupTable, vtkColorTransferFunction, and vtkPiecewiseFunction. 可视化标量数据通常涉及定义从标量值到颜色和不透明度的映射。在几何曲面渲染中,不透明度将定义曲面的半透明性;在体积渲染中,不透明度将表示沿穿过体积的某段光线累积的不透明度。在几何渲染中,此映射通常使用vtkLookupTable创建;在体积渲染中,通常使用vtkcolorttransferfunction和vtkPiecewiseFunction创建。
A minimal example. 以下示例显示了如何使用这些对象指定和渲染场景(VTK/Examples/Rendering/Cxx/Cylinder.cxx)。
vtkCylinderSource *cylinder = vtkCylinderSource::New();
vtkPolyDataMapper *cylinderMapper = vtkPolyDataMapper::New();
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
vtkActor *cylinderActor = vtkActor::New();
cylinderActor->SetMapper(cylinderMapper);
vtkRenderer *ren1 = vtkRenderer::New();
ren1->AddActor(cylinderActor);
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
renWin->Render();
iren->Start();
本例中直接创建了vtkActor、vtkPolyDataMapper、vtKrender、vtkRenderWindow和vtKrenderWindowInteractior。请注意,vtkProperty是由参与者自动创建的,vtkLight和vtkCamera是由vtkRenderer自动创建的。