一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

在vtkImageData中,绘制体数据一种软实现的光线投射算法。算法可以处理所有种类的数据类型,最多四种组件。算法可以采用复合或者MIP渲染方式,并且可以与几何数据混合起来渲染。设置采样间距space可以用来加速渲染进程。此外, 对于固定点精度是15的数据中,可以执行很好的计算。该算法是多线程的,可以跨多核心处理并行扫描。

对于vtkVolumeRayCastMapper来说,该算法是一个很好的替代者。但是,对于下面几种情况该算法无法实现。

  • 不能工作在等值面光线投射的情况下
  • 它只能用内插值取代以前分类组合
  • 它只有最大标量值MIP渲染。

VtkVolumeRayCastMapper不能用于下面2中情况,但vtkFixedPointVolumeRayCastMapper无此限制。

  • 如果数据不是无符号的字符或者无符号的短整形
  • 如果数据位多个组件的组合

从无符号字符类型到双精度浮点类型,该算法都可以处理。

通过创建子采样的提数据,执行跨越式的空间。在原始体数据中,4 × 4 × 4 单元的由最小,最大,并结合渐变和标志值表示。

复制代码
 1 public class FixedPointVolumeFactory
 2     {
 3         public vtkImageData ImageData { get; set; }
 4 
 5         public FixedPointVolumeFactory(vtkImageData imageData)
 6         {
 7             this.ImageData = imageData;
 8         }
 9 
10         public virtual vtkVolume NewActor()
11         {
12             return vtkVolume.New();
13         }
14 
15         public virtual List<vtkProp> MakeActors()
16         {
17             List<vtkProp> actors = new List<vtkProp>();
18             var actor = this.NewActor();
19 
20             vtkColorTransferFunction colorTFunc = this.GenerateColorTFunc();
21             vtkPiecewiseFunction opacityFunc = this.GenerateOpacityFunc();
22             vtkPiecewiseFunction gradient = this.GenerateGradientFunc();
23 
24             vtkVolumeProperty volumeProperty = vtkVolumeProperty.New();
25             volumeProperty.SetColor(colorTFunc);
26             volumeProperty.SetScalarOpacity(opacityFunc);
27             volumeProperty.SetGradientOpacity(opacityFunc);
28             volumeProperty.SetInterpolationTypeToLinear();
29             volumeProperty.ShadeOn();
30 
31             //成体绘制函数:
32             var volumeMapper = vtkFixedPointVolumeRayCastMapper.New();
33             volumeMapper.SetInput(this.ImageData);
34             volumeMapper.SetSampleDistance(0.5f);
35 
36             actor.SetMapper(volumeMapper);
37             actor.SetProperty(volumeProperty);
38 
39 
40             actors.Add(actor);
41             return actors;
42         }
43 
44         /// <summary>
45         /// 梯度变换函数设置灰度值变换的大小与不透明度之间的映射。
46         /// </summary>
47         /// <returns></returns>
48         private vtkPiecewiseFunction GenerateGradientFunc()
49         {
50             var gradient = vtkPiecewiseFunction.New();
51             gradient.AddPoint(50, .2);//灰度值变化梯度与不透明度的关系
52             gradient.AddPoint(500, 1);
53             gradient.AddPoint(1500, 0.7);
54             gradient.AddPoint(2000, .1);
55             return gradient;
56         }
57 
58         /// <summary>
59         /// 不透明度映射函数是设置光线方向上的灰度值及其不透明度映射。
60         /// </summary>
61         /// <returns></returns>
62         private vtkPiecewiseFunction GenerateOpacityFunc()
63         {
64             var opacityTransferFunction = vtkPiecewiseFunction.New();
65             opacityTransferFunction.AddPoint(10, 0.0);//灰度值及不透明度值
66             opacityTransferFunction.AddPoint(50, 0.1);
67             opacityTransferFunction.AddPoint(200, 0.6);
68             opacityTransferFunction.AddPoint(1000, 0.6);
69             opacityTransferFunction.AddPoint(2000, 0.8);
70             opacityTransferFunction.AddPoint(3000, 1);//不透明度值为1则为完全不透明
71             opacityTransferFunction.ClampingOff();
72             return opacityTransferFunction;
73         }
74 
75         /// <summary>
76         /// 颜色映射函数是设置灰度值与RGB颜色的映射。
77         /// </summary>
78         /// <returns></returns>
79         private vtkColorTransferFunction GenerateColorTFunc()
80         {
81             var colorTransferFunction = vtkColorTransferFunction.New();
82             colorTransferFunction.AddHSVPoint(0, 0.67, 0.5, 1);
83             colorTransferFunction.AddHSVPoint(94, 0.67, 0.17, 1);
84             colorTransferFunction.AddHSVPoint(139, 0, 0.4, 0);
85             colorTransferFunction.AddHSVPoint(160, 0.28, 0.447, 1);
86             colorTransferFunction.AddHSVPoint(254, 0.38, 0.413, 1);
87             colorTransferFunction.ClampingOff();
88             return colorTransferFunction;
89         }
90     }
复制代码

 

posted on   一杯清酒邀明月  阅读(492)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示