vtk体绘制

转载自http://blog.csdn.net/www_doling_net/article/details/37906475

【译者:这个系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容。敬请期待^_^。欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!】

【本节对应原书中的第139页至第142页】

7章体绘制

体绘制是一种三维空间中而非三维空间中的二维曲面上绘制三维数据的技术。体绘制和几何绘制并没有严格的界限。两种技术经常会有相似的结果,有时两者又可认为是一种技术。例如,利用轮廓提取技术从图形数据中提取等值面,然后利用几何渲染技术来绘制等值面,也可以使用光线投射技术,在到达某个值时结束光线追踪来绘制等值面。这两种方法产生相似的效果。再比如,基于纹理映射的混合体绘制。该方法的适用数据是图像,因此可以看做是体绘制,也可以看做是几何绘制,因为它使用几何图元和标准的图形硬件。

为了根据渲染数据的属性进行定制,在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”)。另外也可以通过四面体化技术来产生非规则网格来进行体绘制。

对于每种支持的数据类型,都有多种不同的体绘制技术可以使用,接下来会进行具体的分析。然后介绍这些技术中都用到的一些对象和参数,详细分析每种技术细节。最后再讨论一下每个方法的效率问题。

7.1 体绘制支持的数据类型发展历程

VTK最开始仅仅支持的是基于vtkImageData体的绘制方法。vtkVolumeMapper类为这些体绘制方法定义了所有的API函数。后来,基于vtkUnstructuredGrid数据的体绘制方法加入进来。为了保持向前兼容,引入了一个抽象基类作为所有的体绘制方法类的父类。类似地,为vtkVolumeMapper(该类渲染vtkImageData)和vtkUnstructuredGridVolumeMapper(该类负责渲染vtkUnstructuredGrid)引入一个父类vtkAbstractVolumeMapper。

7.2 一个简单的例子

图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。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个三维扫描数据的vtk绘制程序设计.zip是一个基于VTK的程序设计,用于绘制三维扫描数据。该程序支持常见的数据格式,如DICOM、NRRD和MHA等,并可通过用户界面进行数据加载和显示。在程序中,可以对数据进行不同方向的切片、平移、缩放和旋转等操作,以显示不同视角下的图像。此外,该程序还提供了一个ROI(区域感兴趣)选择功能,可用于选择感兴趣区域,并在其中进行进一步的测量和分析。 该程序通过使用VTK的各种模块和可视化工具来实现,具有强大的绘图功能和灵活的用户交互性。在编写程序时,考虑了诸多因素,如稳定性、效率、易用性和可维护性等,以确保程序能够在不同的操作系统上稳定运行。 总之,这个三维扫描数据的vtk绘制程序设计.zip是一个功能丰富、易用性好、界面友好的程序,具有广泛的应用价值,可用于医学、工程和科研领域中的三维可视化操作。 ### 回答2: 三维扫描数据的vtk绘制程序设计.zip是一份使用VTK(Visualization Toolkit)库开发的程序设计文件,用于绘制三维扫描数据的模型。该程序设计文件包含了一个完整的VTK项目,其中包含了整个程序的源代码、库文件及可执行程序等。 该程序设计文件的主要功能是将三维扫描数据转换为三维模型,以直观地展示出扫描的内部结构和组成。该程序设计文件通过读取和处理数据文件中的数据信息,将其转换为各种绘制算法,并最终展示在屏幕上。该程序适用于医学、生物、机械等各个领域。 该程序设计文件具有以下优点: 1. 可以轻松处理各种类型的三维扫描数据,包括CT、MRI、PET等不同来源的数据。 2. 可以根据不同的数据特点进行灵活的绘制,支持不同的绘制算法,如蒙皮、立方、等值面等。 3. 程序的界面友好,可以根据用户需求进行自定义设置,并支持交互式绘制,增强用户验感。 总之,三维扫描数据的vtk绘制程序设计.zip提供了一种灵活、高效、直观的三维扫描数据处理方法,可适用于各种领域的应用需求。 ### 回答3: 这个文件夹中包含了一个使用VTK绘制三维扫描数据的程序。VTK是一种开源的图形处理库,它可以用来处理和显示三维数据。这个程序可以加载三维扫描数据文件,然后将数据转换为绘制,再使用VTK绘制结果显示出来。 这个程序的设计和实现涉及到了多个方面的知识和技术,比如数据结构、算法、计算机图形学等等。在程序中,数据结构用来存储和处理三维扫描数据,算法用来进行数据处理和绘制,计算机图形学知识则用于显示绘制结果。 用户可以使用这个程序来查看三维扫描数据的内部结构,从而更好地理解和诊断疾病。同时,用户也可以通过修改程序代码来实现自己的需求,比如改变绘制方式、加入交互功能等等。 总之,这个程序是一个非常有用的工具,可以帮助医生和研究人员更好地理解和分析三维扫描数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值