高质量的3D LIC矢量纹理生成算法

       前面《高质量的2D LIC矢量纹理生成算法》一文简述了二维矢量场下LIC矢量纹理生成流程,本文将简述三维矢量场下LIC矢量纹理生成算法。
       3D LIC为2D LIC算法向三维矢量场的拓展。该算法的算法思想为 以三维噪声纹理作为输入纹理,对每个点沿矢量方向进行线积分卷积,具体地说为沿三维流线方向进行低通滤波,最后输出三维矢量纹理即体纹理。输出的体纹理由体素构成,每个体素值为 0   255 之间的灰度值,但体纹理与前文实现的二维矢量纹理不同,它不能直接显示在二维屏幕上,需借助体绘制技术进行显示。
       1. 高质量的三维矢量纹理生成
       二维矢量场LIC矢量纹理增强算法主要分流线生成、采样点位置计算、纹理卷积、矢量线强化、矢量纹理噪声注入及合成显示等步骤。由二维矢量场到三维矢量场,数据维度的增加,不仅仅是存储空间的几何增长和可视化难度的增加,许多2D LIC中行之有效的方法在3D LIC中将不再适用。对于上述步骤中涉及到的方法或计算过程,有些可以经简单变换后直接进行拓展应用,有些需要使用其他方法代替或者采用新的方法才能保证绘制的正确,下面分别进行讨论。
       (1)流线生成。对于三维矢量场,由于在三维空间内计算流线,因此计算精度要求较高,数值积分方法应以Runge-Kutta法为主,当然对于变化不是很剧烈的矢量场,欧拉法同样适用;
       (2)采样点位置计算。对于三维空间内采样点位置的计算,插值方法很多。当然,计算精度越高,计算就越耗时,一般有最近邻插值、三线性插值、立方卷积插值及样条插值等方法。一般情况下选用三线性插值方法,该方法实现容易,同时还能保证一定的计算精度;
       (3)纹理卷积。三维矢量场的数据规模比二维矢量场要大很多,数据大小越高,计算就越耗时。因此卷积长度的大小对算法的执行效率影响很大,当然对绘制质量影响也很大。在综合考虑计算负荷及绘制质量的情况下,一般认为三维矢量场LIC 纹理卷积长度在8 ~ 12之间,是二维矢量场卷积长度的一半;
       (4)矢量线强化。矢量线强化仍然选用垂直流线方向的高通滤波方法,以增加流线之间的对比度。在三维矢量场中,垂直流线方向并不像二维矢量场那样,为一条直线,而是一个平面,因此高通滤波方式存在多种可能。通常有三种高通滤波策略,如下图所示:
                                                                        高质量的3D LIC矢量纹理生成算法_第1张图片
一是基于流线所在流面的一维高通滤波,即选择 P s1 P s2 作为采样点;二是基于流线所在流面法线的高通滤波,即选择 P n1 P n2 作为采样点;三是综合前两种方法的二维高通滤波,即同时选择 P s1 P s2 P n1 P n2 作为采样点。文献[4] 对此进行了研究,得出基于流线所在流面的一维高通滤波能生成较好的矢量纹理和清晰的流线,基于流面法线的高通滤波则容易产生较为模糊的流线,绘制质量较低,而第三种滤波策略绘制质量介乎于前两者之间,因此本文在算法实现时采用了第一种高通滤波方法;
       (5)噪声注入与混合。在连续纹理卷积与高通滤波过程中,在三维矢量纹理中注入一定比例的噪声,可以增加矢量线间的强度对比,改善绘制质量。对于三维矢量场,在算法实现时,可预先创建一个与矢量纹理同分辨率的三维数组来保存噪声,作为需要注入的噪声源参与运算;
       (6)合成显示。借助体绘制技术进行显示,本文采用了纹理体绘制方法对三维矢量纹理进行显示。
       2. 三维矢量纹理显示
        生成的三维矢量纹理实际上是一组具有矢量相关性并且致密的三维数据场。需要借助体绘制技术将其绘制显示出来。在绘制前,首先需要进行数据分类,即通过传递函数对数据场中每个数据值即体素进行颜色和不透明度赋值。由于基于纹理的矢量场可视化方法是通过相应的滤波计算将颜色按照一定方式排列成有序的图案,以表示出一定的方向信息,因此通过3D LIC算法得到的体素已经具有了颜色属性,不需要设计颜色传递函数,但缺乏不透明度属性,因此需要设计不透明度传递函数来实现体素的合理分类。对于结构不是很复杂的数据场,基于矢量大小的不透明度传递函数是一种合适的选择。在算法实现时,以速度大小对体纹理进行划分,对速度较大的体素设置为较高的不透明度,而其他体素设置为较小的不透明度,甚至有些体素不透明度设置为0,即完全透明,这样就可以直接观察重点区域,而忽略非重点区域,避免数据过度遮挡和紊乱。基于矢量大小的不透明度传递函数。基本公式为:
                                                                   
其中, s i,j,k 为数据场坐标 ( i ,   j ,   k ) 处体素的值, α 为转换后的不透明度值。 | v | 为矢量大小,算法实现时一般先将其归一化,即取值范围为 | v | [0, 1] m 1 m 2 为自定义的划分区间, m 1 m 2 取值范围为 0.0 ~ 1.0 ,当然也可以采用划分更多区间的方法,实现对数据场的分类。
       本文选用的测试数据 为台风模拟数据 Tornado ,数据大小为 128 × 128 × 128 。台风是一种强烈的热带气旋,发生时一边绕自己的中心急速旋转,一边随周围大气向前移动,越靠近气旋中心,风速越大,但在气旋中心即台风眼,风速反而很小。 图1 Tornado 数据在算法相同参数、不同视点下绘制的结果。图 1 左侧三幅图为标准 3D LIC 算法绘制结果,相应右侧三幅图为增强型 3D LIC 算法绘制结果。通过对比可知,通过对 3D LIC 矢量纹理采用连续纹理卷积及连续一维高通滤波的增强策略,三维矢量线间对比度得到了显著提高,矢量场方向容易观察,纹理细节清晰,没有突变或颜色同化等不良效果。
                                        高质量的3D LIC矢量纹理生成算法_第2张图片
                                        高质量的3D LIC矢量纹理生成算法_第3张图片
                                        高质量的3D LIC矢量纹理生成算法_第4张图片
       通过对公式1 进行扩展,采用划分更多区间的方法,可实现数据场多组数据的同时显示。图2 Tornado 数据在算法相同参数、不同传递函数及不同视点下绘制的结果。由图可知,通过多组数据的同时显示,可以更加直观的了解台风数据的分布情况及漩涡特征,并能准确判断台风眼的位置。
                                        高质量的3D LIC矢量纹理生成算法_第5张图片
                                   高质量的3D LIC矢量纹理生成算法_第6张图片
       由于三维数据场的复杂性,通过采用传递函数对数据场进行合理分类后,在最终显示时数据之间仍然会存在一定遮挡,使得数据场某些区域可视化效果并不明显。剖面是最常用的一种三维数据场可视化方法,通过将数据场降维的方式,有针对性的对某层数据进行显示,实现间接了解三维数据场隐含的信息。图3 (a)   3(b)   分别为图   2(a)   2(d)   的剖面。通过对剖面的观察可知,矢量方向更加清晰,数据场的轮廓特征变得更加容易辨别。
                                        高质量的3D LIC矢量纹理生成算法_第7张图片
等值面技术在三维数据场可视化中应用非常广泛。在数据场中抽取指定数值的等值面可以有效的反映该数据值的分布状况。对于体纹理通过设置不透明度值同样可以获得等值面,即将准备分析的数据值设置为较高的不透明度,甚至完全不透明,以获得该数据值的分布曲面,如图4所示为Tornado 数据不同风速的等值面。
                                        高质量的3D LIC矢量纹理生成算法_第8张图片

       相关算法已开源:https://github.com/0x7dc/VolumeLIC


参考文献:
[1]  唐泽圣. 三维数据场可视化. 清华大学出版社,1999.
[2]  Cullip T, Neumann U. Accelerated Volume Reconstruction with 3D Texture Mapping Hardware. Carolina : University of North Carolina, 1993.
[3]  Cabral B, Cam N, Foran J. Accelerated Volume Rendering and Tomographic Reconstruction Using Texture Mapping Hardware. Proceeding of ACM Symposium on Volume Visualization, Washington, 1994 : 91-98.
[4]  周迪斌, 解利军 , 郑耀 . 基于纹理的增强型 3D流场绘制 . 计算机辅助设计与图形学学报 , 2009, 21(3) : 406-411.



你可能感兴趣的:(可视化技术,/,图形学)