体绘制技术,更多的时候,我们把它称为三维重建(区别于投影图像的三维重建),是一种直接利用体数据来生成二维图像的绘制技术。与面绘制不同,体绘制不需要提取体数据内部的等值面,它是对三维体数据进行采样和合成的过程。体数据能过通过设置不透明度值来显示体数据内部的不同成分和细节,例如显示人体CT图像的不同器官和组织。
从可视化管线的组成上来讲,体绘制的渲染管线与几何渲染管线基本一致
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import vtk
reader = vtk.vtkStructuredPointsReader()
reader.SetFileName(r'E:/mummy.128.vtk')
reader.Update()
volumeMapper = vtk.vtkFixedPointVolumeRayCastMapper()
volumeMapper.SetInputData(reader.GetOutput())
# volumeMapper.SetSampleDistance(volumeMapper.GetSampleDistance()*4) # 设置光线采样距离
# volumeMapper.SetAutoAdjustSampleDistances(0) # 设置图像采样步长
# volumeMapper.SetImageSampleDistance(4)
volumeProperty = vtk.vtkVolumeProperty()
volumeProperty.SetInterpolationTypeToLinear() # 设置体绘制的属性设置,决定体绘制的渲染效果
volumeProperty.ShadeOn() # 打开或者关闭阴影
volumeProperty.SetAmbient(0.4)
volumeProperty.SetDiffuse(0.6) # 漫反射
volumeProperty.SetSpecular(0.2) # 镜面反射
# 设置不透明度
compositeOpacity = vtk.vtkPiecewiseFunction()
compositeOpacity.AddPoint(70, 0.00)
compositeOpacity.AddPoint(90, 0.40)
compositeOpacity.AddPoint(180, 0.60)
volumeProperty.SetScalarOpacity(compositeOpacity) # 设置不透明度
# 测试隐藏部分数据,对比不同的设置
# compositeOpacity.AddPoint(120, 0.0)
# compositeOpacity.AddPoint(180, 0.6)
# volumeProperty.SetScalarOpacity(compositeOpacity)
# 设置梯度不透明属性
volumeGradientOpacity = vtk.vtkPiecewiseFunction()
volumeGradientOpacity.AddPoint(10, 0.0)
volumeGradientOpacity.AddPoint(90, 0.5)
volumeGradientOpacity.AddPoint(100, 1.0)
# volumeProperty.SetGradientOpacity(volumeGradientOpacity) # 设置梯度不透明度效果对比
# 设置颜色属性
color = vtk.vtkColorTransferFunction()
color.AddRGBPoint(0.0, 0.0, 0.0, 0.0)
color.AddRGBPoint(64.0, 1.0, 0.52, 0.3)
color.AddRGBPoint(109.0, 1.0, 1.0, 1.0)
color.AddRGBPoint(220.0, 0.2, 0.2, 0.2)
volumeProperty.SetColor(color)
volume = vtk.vtkVolume() # 和vtkActor作用一致
volume.SetMapper(volumeMapper)
volume.SetProperty(volumeProperty)
renderer = vtk.vtkRenderer()
renderer.SetBackground(1.0, 1.0, 1.0)
renderer.AddVolume(volume)
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindow.SetSize(640, 480)
renderWindow.Render()
renderWindow.SetWindowName('VolumeRenderingApp')
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
renderWindowInteractor.Initialize()
renderWindowInteractor.Start()