【译者:这个系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容。敬请期待^_^。欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!】
【本节对应原书中的第139页至第142页】
体绘制是一种三维空间中而非三维空间中的二维曲面上绘制三维数据的技术。体绘制和几何绘制并没有严格的界限。两种技术经常会有相似的结果,有时两者又可认为是一种技术。例如,利用轮廓提取技术从图形数据中提取等值面,然后利用几何渲染技术来绘制等值面,也可以使用光线投射技术,在到达某个值时结束光线追踪来绘制等值面。这两种方法产生相似的效果。再比如,基于纹理映射的混合体绘制。该方法的适用数据是图像,因此可以看做是体绘制,也可以看做是几何绘制,因为它使用几何图元和标准的图形硬件。
为了根据渲染数据的属性进行定制,在VTK中两种渲染技术进行了区分。到目前为止看到的例子中,数据渲染都会用到vtkActor,vtkProperty以及vtkMapper的子类。vtkActor中保存了位置,方向以及缩放等信息,以及Property和mapper指针。vtkProperty中存储了数据渲染时的表面属性,例如环境光参数,阴影类型等。vtkMapper则负责数据渲染。对于体绘制,可以使用的类比较多。vtkVolume用来替代vtkActor表示空间对象。类似于vtkActor,vtkVolume中存储了数据的位置,方向和缩放参数。但是,其内部还有vtkVolumeProperty和vktAbstractVolumeMapper的引用。vtkVolumeProperty中存储了影像数据实际显示效果的参数,这些参数不同与几何绘制的参数。vktAbstractVolumeMapper负责数据体绘制和输入数据的合法性检查。
VTK中对于矩形网格数据(vtkImageData)和非规则网格(vtkUnstructuredGrid)都可以进行体绘制。根据具体vktAbstractVolumeMapper子类的SetInput()函数来设置相应的数据指针(vtkImageData或者vtkUnstructuredGrid)。注意,可以将非规则数据进行重采样为规则数据进行体绘制。(100页“Probing”)。另外也可以通过四面体化技术来产生非规则网格来进行体绘制。
对于每种支持的数据类型,都有多种不同的体绘制技术可以使用,接下来会进行具体的分析。然后介绍这些技术中都用到的一些对象和参数,详细分析每种技术细节。最后再讨论一下每个方法的效率问题。
VTK最开始仅仅支持的是基于vtkImageData体的绘制方法。vtkVolumeMapper类为这些体绘制方法定义了所有的API函数。后来,基于vtkUnstructuredGrid数据的体绘制方法加入进来。为了保持向前兼容,引入了一个抽象基类作为所有的体绘制方法类的父类。类似地,为vtkVolumeMapper(该类渲染vtkImageData)和vtkUnstructuredGridVolumeMapper(该类负责渲染vtkUnstructuredGrid)引入一个父类vtkAbstractVolumeMapper。
图7-1中展示了一个简单的体绘制效果(参考VTK/Examples/VolumeRendering/Tcl/SimpleRayCast.tcl)。该例子中对vtkImageData采用光线投射方法进行体绘制,代码中黑体部分是体绘制的相关代码。从该例可以看出体绘制相关代码可以使用的其他的mappers进行替换来实现体绘制,主要包括针对vtkImageData的纹理映射方法,针对vtkUnstructuredGrid数据的基于投影的体绘制方法。在当前例子中只需要该很小的改动,因为大多数的功能函数都在基类中定义,因此对于所有的体绘制方法子类是共有的。
图7-1 体绘制
# Create the reader for the data
vtkStructuredPointsReader reader
reader SetFileName"$VTK_DATA_ROOT/Data/ironProt.vtk"
# Create transfer mapping scalar value to opacity
vtkPiecewiseFunction opacityTransferFunction
opacityTransferFunction AddPoint 20 0.0
opacityTransferFunction AddPoint 255 0.2
# Create transfer mapping scalar value to color
vtkColorTransferFunction colorTransferFunction
colorTransferFunction AddRGBPoint 0.0 0.0 0.0 0.0
colorTransferFunctionAddRGBPoint 64.0 1.0 0.0 0.0
colorTransferFunction AddRGBPoint 128.0 0.0 0.0 1.0
colorTransferFunction AddRGBPoint 192.0 0.0 1.0 0.0
colorTransferFunction AddRGBPoint 255.0 0.0 0.2 0.0
# The property describes how the data will look
vtkVolumeProperty volumeProperty
volumeProperty SetColor colorTransferFunction
volumeProperty SetScalarOpacity opacityTransferFunction
volumeProperty ShadeOn
volumeProperty SetInterpolationTypeToLinear
# The mapper / ray cast function know how to renderthe data
vtkVolumeRayCastCompositeFunction compositeFunction
vtkVolumeRayCastMapper volumeMapper
volumeMapper SetVolumeRayCastFunction compositeFunction
volumeMapper SetInputConnection [readerGetOutputPort]
# The volume holds the mapper and the property and
# can be used to position/orient the volume
vtkVolume volume
volumeSetMapper volumeMapper
volume SetProperty volumeProperty
ren1 AddVolume volume
renWin Render
首先从硬盘上读取一个图像,接着为vtkVolumeProperty定义两个函数,分别负责将像素映射为不透明度和颜色。然后,定义一个专用于光线投射体绘制方法的vtkVolumeRayCastCompositeFunction对象。该对象负责合成投射光线上的采样点数据。另外还定义一个vtkVolumeRayCastMapper对象执行基本的光线投射操作,如空间变换和裁剪等。将读入的图像作为mappper对象的输入数据,并创建一个vtkVolume(该类是vtkProp3D的子类,与vtkActor功能类似)对象来粗存储mapper和property对象。最后,将vtkVolume对象添加至renderer中实现场景渲染。
如果使用二维纹理映射方法来替代光线投射方法,那么黑体部分代码可以替换为:
vtkVolumeTextureMapper2D volumeMapper
volumeMapper SetInputConnection [ readerGetOutputPort ]
如果显卡支持三维纹理映射的话,那么上面代码还可以采用三维纹理映射替换如下:
vtkVolumeTextureMapper3D volumeMapper
volumeMapper SetInputConnection [ readerGetOutputPort ]
vtkFixedPointRayCastMapper也可以用来替换vtkVolumeRayCastMapper,并且在多数情况下推荐使用该mapper。vtkFixedPointRayCastMapper将所有数据类型都看做为多元数据,并使用定点计算和空间跳跃技术来实现高效计算。然后由于其混合操作采用的是硬编码,因此难于定制新的光线投射算法,可扩展性较差。上例中用vtkFixedPointRayCastMapper替换如下:
vtkFixedPointRayCastMapper volumeMapper
volumeMapper SetInputConnection [ readerGetOutputPort ]
如果使用非规则数据的体绘制方法进行替换的话,那么替换的代码就会稍微复杂一些,因为在设置mapper输入前,需要先将vtkImageData数据转换为vtkUnstructuredGrid类型数据。下面代码中使用了非规则网格体绘制技术,通过显卡将四面体网格数据进行投影。
#convert data to unstructured grid
vtkDataSetTriangleFilter tetraFilter
tetraFilter SetInputConnection [ readerGetOutputPort ]
#creates the objects specific to the projectedtetrahedral method
vtkProjectedTetrahedraMapper volumeMapper
volumeMapper SetInputConnection [ tetraFilter GetOutputPort]
需要注意的是,不推荐将vtkImageData转换为vtkUnstructuredGrid数据。因为针对vtkImageData的mappers无论在时间效率上还是渲染效果上都要优于针对vtkUnstructuredGrid的mappers。
原文:http://blog.csdn.net/www_doling_net/article/details/37906475