学习笔记14

一.体绘制

尤其要注意:所谓面数据,并不是说二维平面数据,而是说这个数据中只有表面细节,没有包含体细节,实际上体数据和面数据的本质区别,在于是否包含了体细节,而不是在维度方面。

(举例而言,你面前有一间房子,房子中有家具、家电,站在房子外面只能看到外部形状,无法观察到房子的布局或者房子中的物体;假设房子和房子中的物体都是半透明的,这样你就可以同时查看到所有的细节。这就是体绘制所要达到的效果。)

1.体绘制以物体对光的吸收原理为理论基础。【光线吸收、反射模型】

在实现方式上基于透明度合成计算模型:在同一射线方向上对体数据进行采样,获取多个体素的颜色值,然后根据其透明度进行颜色的合成。(颜色、透明度、梯度

2.体数据相关专业术语有:体素(Voxel )、体纹理(Volume Texture =3D Texture)。

【体素】

•由最邻近的两层图像的各4个角点所构成的立方体区域,相当于二维平面的像素的概念,图中每个小方块代表一个体素。

•不存在绝对空间位置的概念,只有在体空间中的相对位置。

【体纹理】

按照一定规则将三维数据存放在 XY 像素平面所得到的纹理,称之为 volume texture 。

•体数据最主要的文件存储格式,按照一定规则将三维数据存放在XY像素平面所得到的纹理,称之为volume texture。

•体数据通常是由CT 仪器进行扫描得到的,然后保存在图片的像素点上。目前国际上比较常用的体纹理格式有,基于DirectX的.dds格式和.raw格式。注意这里用于体纹理的.raw格式存放的是三维数据,而用于摄像器材的.raw格式只是普通的二维图片。

※体纹理并不是空间的模型数据,他只是描述了三维的数据(类似于编程时候用一维数组存储二维数组、三维数组的思想)。

※空间体模型(通常是规则的立方体或圆柱体)和体纹理相互结合才能进行体渲染。比如二维的纹理贴图效果。也就是说,我们想要看到体纹理数据,在体绘制中需要一个三维模型作为体纹理的载体,体纹理通过纹理坐标(三维)和模型进行对应,然后由视点向模型上的点引射线,该射线穿越模型空间等价于射线穿越了体纹理。通常使用普通的立方体或者圆柱体作为体绘制的空间模型。

3.♥主要算法:

①物体空间方法(对象顺序绘制)

从体数据的每个体素出发】计算体数据内部每个体素重建后对屏幕像素的贡献值,最终获得绘制效果。如,抛雪球算法(Splatting从每个体素对屏幕抛一个雪球,形成一个雪斑块,能量从中心向外扩散并减弱(高斯函数)

②图像空间方法(图像顺序绘制)

从屏幕的每个像素出发】计算输出图像上每个像素所投射出的光线的累积,获得绘制效果。如,光线投射算法

Ray-casting从视点出发,穿过每个屏幕像素形成的透视投影?

Others:

错切-变形算法(Shear-warp)

频域体绘制算法(Frequency Domain)

4.♥VTK使用Ray-Cast进行体绘制

原理:从屏幕上每一个像素点出发,沿着视线方向发射出一条光线,当这条光线穿过体数据时,沿着光线方向等距离采样,利用插值计算出采样点的颜色值和不透明度;接着按照从前到后或从后到前的顺序对光线上的采样点进行合成,计算出这条光线对应的屏幕上像素点的颜色值。

光线投射是目前应用最为广泛的体绘制方法。然而当观察方向发生变化时,采样点的前后关系也必然变化,因此需要重新进行采样,计算量极为庞大。针对算法所存在的问题,人们提出了不少优化方法,如光线提前终止、利用空间数据结构来跳过无用的体素,如八叉树、金字塔、k-d树等。

vtkVolume[派生自vtkProp]

表示渲染场景中的体数据对象

•存储基本变换信息(平移、旋转、缩放等)

•内部对象vtkAbstractVolumeMapper(根据不同的体绘制算法获取其内部生成的图元数据)

•内部对象vtkVolumeProperty(设置体绘制的属性对象)

vtkVolumeProperty对象需要设置

的属性

数据场映射到光学场

vtkColorTransferFunction

//Defines a transfer function for mapping a property to an RGB color value.

 

//uses piecewise hermite functions

 

vtkPiecewiseFunction【piecewise:分段】

【颜色映射】

(单→多值映射)

vtkColorTransferFunction类设置:

•volumeProperty->SetColor(volumeColor);

【不透明度映射】

(单→单值映射)

分段线性标量映射函数,通过vtkPiecewiseFunction类设置映射点和对应透明度;利用该函数可将光线投影过程中的采样点灰度值映射为不同的不透明度值。不透明度,0表示完全透明,1表示完全不透明。

•volumeProperty->SetScalarOpacity(volumeScalarOpacity);

【梯度映射】

(单→单值映射)

通过vtkPiecewiseFunction类设置。将梯度模值(单位距离内密度改变值)映射为一个不透明度乘子,增强边缘过渡区域的显示效果。例如在不同材料的临界区域,如空气到软组织,或者软组织到骨头的临界

区,梯度值会比较大,而材料的内部梯度值则会相对比较小。

•volumeProperty->SetGradientOpacity(volumeGradientOpacity);

【光照与阴影效果】

由环境光系数、漫反射光系数、镜面反射光系数和高光强度控制

环境光系数占主导时,阴影效果不明显;散射光系数占主导时,显示效果会比较粗燥;反射光系数占主导时,显示效果会比较光滑。阴影效果关闭时,等同于环境光系数为1.0,其他两个系数为零。阴影效果还与光源的数目、位置和颜色有关。开启阴影后体绘制效果会更加清晰逼真。(对MIP无效)

•vtkVolumeProperty::ShadeOn();//打开阴影效果

•vtkVolumeProperty::SetAmbient()设置环境光系数

•vtkVolumeProperty::SetDiffuse()设置散射光系数

•vtkVolumeProperty::SetSpecular()设置反射光系数

•VTKVolumeProperty::SetSpecularPower()设置高光强度,控制体绘制外观平滑程度。

vtkAbstractVolumeMapper设置

如果使用【vtkVolumeRayCastMapper】——光线投射算法

※指定一条光线上的最终颜色值合成计算方法: (某条投影光线与体数据的交点上选取部分来渲染)

•vtkVolumeRayCastIsosurfaceFunction 只渲染投影光线上标量值等于指定阈值的点。类似于选出等值面,再投影

•vtkVolumeRayCastMIPFunction 只渲染投影光线上最大强度(标量值/不透明度)的点。

•vtkVolumeRayCastCompositeFunction 对投影光线上所有点进行颜色叠加

※crop 可以选择只显示一部分数据mapper->CroppingOn() 可以指定六个参数

※mapper可以设置梯度估值器来控制法线 mapper->setGradientEstimator(vtkFiniteDifferenceGradientEstimator)

vtkLODProp3D

体绘制加速,提高渲染速度和交互速度

5.♥【关于ImageData的一些tips】vtk集成的reader在读取三维数据的时候,其实就是在填充vtkImagedata的过程。本质上,三维重建是对vtkImagedata的重建,无论什么格式的图像(除了几何图形)读取进来以后都会变成vtkImagedata

6.颜色映射:https://blog.csdn.net/shenziheng1/article/details/54915682

色调(H),饱和度(S),明度(V)

透明度映射:https://blog.csdn.net/shenziheng1/article/details/54914495

多元数据的组分可能是非独立的,例如,RGB图像中每个像素的颜色值是由R.G.B三个颜色组分共同定义的。vtkVolumeMapper支持两种类型的非独立多元数据。

第一种是二元数据。第一元数据用于定义颜色传输函数,第二元数据用于定义不透明度传输函数;

第二种是四元数据。前三元数据作为一个R.G.B颜色定义颜色传输函数,第四元数据用于定义不同明度传输函数。

需要注意的是,两种方式都是利用最后一元数据来计算梯度,并决定梯度不透明度传输函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴你对 S32K14X 感兴趣!S32K14X 是 NXP 公司推出的一款 ARM Cortex-M4 内核的汽车级微控制器,主要用于汽车电子系统的应用。下面是一些 S32K14X 学习笔记的内容: 1. 架构概述:S32K14X 基于 ARM Cortex-M4 内核,具有高性能和低功耗的特性。它包含了丰富的外设模块,例如模数转换器(ADC)、定时器(TIM)、通用串行接口(UART、SPI、I2C)等,适用于多种汽车电子应用场景。 2. 开发环境搭建:S32K14X 的开发可以使用 NXP 官方提供的 S32 Design Studio 或者其他支持 ARM Cortex-M 开发的集成开发环境(IDE),如 Keil MDK、IAR Embedded Workbench 等。 3. 程序编写:使用 C/C++ 语言进行程序编写,可以利用官方提供的开发工具链和库函数进行开发。需要了解 S32K14X 的寄存器映射和外设控制寄存器的使用方法,以实现相应功能。 4. 外设配置:根据具体应用需求,配置 S32K14X 的外设模块,如 ADC 的通道选择、定时器的时钟设置等。可以参考官方提供的开发文档和示例代码进行配置和开发。 5. 调试与测试:在开发过程中,可以使用 JTAG/SWD 调试器连接 S32K14X 板卡,进行程序的下载、调试和测试。可以通过断点、观察表等功能,帮助定位和解决问题。 6. 应用案例:S32K14X 可以应用于车身电子、底盘控制、驾驶辅助等多个汽车电子系统。学习过程中可以关注相关应用案例,了解实际场景下的应用方法和技巧。 以上是 S32K14X 学习笔记的一些内容,希望对你有所帮助!如果你有具体的问题或者需要更多资料,可以进一步向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值