摘要:本文通过在物体表面纹理的造型算法中引入流体力学中的湍流概念而成功实现了对大理石表面纹理的模拟仿真。
前言 计算机仿真模拟技术在生物、医学以及国防等诸多科研和应用领域得到了广泛的应用。仿真的过程也就是把仿真对象从物体提炼成数学模型的过程,因此其内在数学模型的提炼和从数学模型设计出相应的仿真算法在整个仿真过程中是很关键的两个环节。本文以大理石为例,通过引入流体力学中湍流概念从数学角度提出了一个仿真效果比较好的纹理仿真算法,并给出了关键部分的VC++编码。
过程纹理造型技术 过程纹理造型技术在功能同二维纹理管理技术比较相似。但由于二维纹理管理技术采用固定的图像来描述表面细节,而客观世界中的自然物体表面纹理却往往具有较强的不规则性和随机性,因此这种采用固定图像对表面细节进行描述的纹理造型技术效果并不好,不能对自然物体进行较好的造型和模糊。在20世纪80年代中后期提出的过程纹理造型技术采用代码段或算法来编码抽取模型细节,并且允许高层控制和规范,从根本上克服了二维纹理管理技术的上述缺陷。而且该技术是通过控制参数来管理纹理数据的放大,因此在仿真过程中只需简单地设定若干个控制参数就可以动态产生大量丰富的几何细节。
1985年由Peachey和Perlin所提出的三维纹理映射方法将三维纹理函数直接定义在三维纹理空间中,数学形式为:
T=T(x,y,z)(T:颜色的RGB值; (x,y,z):空间点三维坐标)。现在用来构造三维纹理的基本方法常用的主要有两种:
基于高频采样的数字化纹理和采用数学模型动态计算生成纹理。基于高频采样的数字化纹理由于需要有三维数组的支持,在处理高分辨率的纹理时占用空间将急剧增大,对空间的要求比较苛刻。一些真实感较强的图形合成系统多采用数学模型动态计算生成纹理的纹理定义方法。经过多年的研究实践已经开发积累了许多过程迭代函数以产生各种复杂的纹理,这些过程纹理(procedural texture)函数被证明是非常有效的,已经可以对木材、大理石、云彩、火焰和石板等许多自然物体的纹理进行逼真的模拟仿真。这些函数从本质上来说都是一种经验模型。
在算法中引入湍流概念 湍流(turbulence)本是流体力学中的重要研究对象,但在此不准备从湍流的精确物理模型出发对其做任何讨论,而是提出一种近似描述该物理现象的经验模型。这种技术最早在1985年由Perlin提出,曾成功用于对大理石、火焰以及云彩等纹理的仿真。这种经验模型是由一系列的三维噪声函数叠加而成,根据流体力学中湍流的有关概念可以得出可以体现上述经验模型的数学表达式:
turbulence(p)=∑|Noise(pow(2,i)*p)/(pow(2,i))|
其中,p为一纹理空间中的点(x,y,z)。求和区间为i从0到k,上限k是满足下列不等式的最小整数:
1/(pow(2,k+1))<像素通长。通过选取满足上述条件的求和上限值 k,可以避免采样湍流函数时的走样现象。该函数表达式任取和式的相邻两项,后一项噪声函数的变化频率总是前一项函数的变化频率的两倍,幅度则为前者的一半,也就是对湍流函数的贡献率减小了一半。因此,上述的构造方法从数学上保证了湍流函数本身就具有一定的自相似特性。从信号分析的角度看,则其功率谱分布满足1/f的规律。该函数并不能直接对纹理进行仿真,我们所借鉴的只是其随机性和自相关特性,这些特性在纹理定义时可以很好的描述各种自然纹理的不规则细节。因此湍流函数在纹理造型算法中还是能起到重要作用的。纹理的描述过程大致分两步:首先选取一个简单的合适的函数来描述自然物体如大理石的基本纹理结构特征,其中选取的这个描述函数一般应当是连续的且其一阶导数应具有较大的变化。在选定描述函数后用湍流函数来对描述函数的某些基本参数进行扰动,以产生复杂的不规则纹理细节。
对于本文的研究对象--大理石,可以注意到大理石漂亮的纹理其实是其内部不同组成材质的颜色的反映,因此可以定义一个函数来描述这种构造。大理石区别于普通石材的一个比较明显的特点是其纹理多呈周期分布,对此特性可用某方向的正弦波函数作为彩色滤波:
marble(p) = marble_color(sin(x))
p仍为空间点(x,y,z),marble_color()为彩色滤波函数,把[-1,1]区间内任一函数值映射成为RGB颜色之间的颜色值,通常将其表达为三条各自独立的样条曲线。在采取了纹理描述的第二步引入了湍流扰动后,上述函数变为最终的描述函数:
marble(p) = marble_color(sin(x+turbulence(p)))
算法的实现 根据前面总结的结论,笔者经过实验发现,如果定义的样条曲线在某些点存在较大的一阶导数,那么用该样条曲线模拟出来的大理石表面纹理将存在较明显的尖锐边界。在下面采取的描述算法中样条曲线为线性函数(一次样条),效果还是适中的:
COLORREF marble(float px,float py,float pz) { float y=py+3.0*turbulence(px,py,pz,0.0125); y=sin(y*M-PI); return (marble_color(px)); }
……
COLORREF marble_color(float px); { COLORREF col; float x=sqrt(px+1.0)*0.7071; int G=(int)(0.30+0.8*x); x=sqrt(x); int R=(int)(0.30+0.6*x); int B=(int)(0.60+0.4*x); return col; }
|
以上两段代码可以较好地对大理石纹理做仿真模拟处理。同其他纹理一样,湍流函数也可以用来表达各种表面颜色属性的不规则性如凹凸纹理、透明度等。
小结 本文通过在过程纹理造型技术引入流体力学的湍流概念,成功对大理石的表面纹理作了仿真模拟。通过本文对大理石纹理的计算机仿真的实现过程,可对此类仿真模拟程序有一个基本的认识。湍流函数算法也适用于需要对参数进行扰动处理的其他一些仿真环境。本文程序算法在Windows 98 SE下,由Microsoft Visual C++ 6.0编译调试通过。
查看本文来源