在vtkImageData中,绘制体数据一种软实现的光线投射算法。算法可以处理所有种类的数据类型,最多四种组件。算法可以采用复合或者MIP渲染方式,并且可以与几何数据混合起来渲染。设置采样间距space可以用来加速渲染进程。此外, 对于固定点精度是15的数据中,可以执行很好的计算。该算法是多线程的,可以跨多核心处理并行扫描。
对于vtkVolumeRayCastMapper来说,该算法是一个很好的替代者。但是,对于下面几种情况该算法无法实现。
- 不能工作在等值面光线投射的情况下
- 它只能用内插值取代以前分类组合
- 它只有最大标量值MIP渲染。
VtkVolumeRayCastMapper不能用于下面2中情况,但vtkFixedPointVolumeRayCastMapper无此限制。
- 如果数据不是无符号的字符或者无符号的短整形
- 如果数据位多个组件的组合
从无符号字符类型到双精度浮点类型,该算法都可以处理。
通过创建子采样的提数据,执行跨越式的空间。在原始体数据中,4 × 4 × 4 单元的由最小,最大,并结合渐变和标志值表示。
public class FixedPointVolumeFactory { public vtkImageData ImageData { get; set; } public FixedPointVolumeFactory(vtkImageData imageData) { this.ImageData = imageData; } public virtual vtkVolume NewActor() { return vtkVolume.New(); } public virtual List<vtkProp> MakeActors() { List<vtkProp> actors = new List<vtkProp>(); var actor = this.NewActor(); vtkColorTransferFunction colorTFunc = this.GenerateColorTFunc(); vtkPiecewiseFunction opacityFunc = this.GenerateOpacityFunc(); vtkPiecewiseFunction gradient = this.GenerateGradientFunc(); vtkVolumeProperty volumeProperty = vtkVolumeProperty.New(); volumeProperty.SetColor(colorTFunc); volumeProperty.SetScalarOpacity(opacityFunc); volumeProperty.SetGradientOpacity(opacityFunc); volumeProperty.SetInterpolationTypeToLinear(); volumeProperty.ShadeOn(); //成体绘制函数: var volumeMapper = vtkFixedPointVolumeRayCastMapper.New(); volumeMapper.SetInput(this.ImageData); volumeMapper.SetSampleDistance(0.5f); actor.SetMapper(volumeMapper); actor.SetProperty(volumeProperty); actors.Add(actor); return actors; } /// <summary> /// 梯度变换函数设置灰度值变换的大小与不透明度之间的映射。 /// </summary> /// <returns></returns> private vtkPiecewiseFunction GenerateGradientFunc() { var gradient = vtkPiecewiseFunction.New(); gradient.AddPoint(50, .2);//灰度值变化梯度与不透明度的关系 gradient.AddPoint(500, 1); gradient.AddPoint(1500, 0.7); gradient.AddPoint(2000, .1); return gradient; } /// <summary> /// 不透明度映射函数是设置光线方向上的灰度值及其不透明度映射。 /// </summary> /// <returns></returns> private vtkPiecewiseFunction GenerateOpacityFunc() { var opacityTransferFunction = vtkPiecewiseFunction.New(); opacityTransferFunction.AddPoint(10, 0.0);//灰度值及不透明度值 opacityTransferFunction.AddPoint(50, 0.1); opacityTransferFunction.AddPoint(200, 0.6); opacityTransferFunction.AddPoint(1000, 0.6); opacityTransferFunction.AddPoint(2000, 0.8); opacityTransferFunction.AddPoint(3000, 1);//不透明度值为1则为完全不透明 opacityTransferFunction.ClampingOff(); return opacityTransferFunction; } /// <summary> /// 颜色映射函数是设置灰度值与RGB颜色的映射。 /// </summary> /// <returns></returns> private vtkColorTransferFunction GenerateColorTFunc() { var colorTransferFunction = vtkColorTransferFunction.New(); colorTransferFunction.AddHSVPoint(0, 0.67, 0.5, 1); colorTransferFunction.AddHSVPoint(94, 0.67, 0.17, 1); colorTransferFunction.AddHSVPoint(139, 0, 0.4, 0); colorTransferFunction.AddHSVPoint(160, 0.28, 0.447, 1); colorTransferFunction.AddHSVPoint(254, 0.38, 0.413, 1); colorTransferFunction.ClampingOff(); return colorTransferFunction; } }