您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 基于三维纹理的实时流体模拟1
基于三维纹理的实时流体模直接体绘制是一种强大的三维可视化技术,它可以直接将三维离散数据投影在二维平面生成高质量的图像。然而随着图形加速技术的发展和大范围普及,现今主流PC显卡都具备三维纹理加速功能通过OpenGL三维纹理扩展,可以很方便地实现实时交互的直接体绘制。随着计算机图形学的日益发展,实时流体模拟成为计算机图形学中的另一个热点问题.经典的流体力学方程如纳维-斯托克斯方程组(Navier-StokesEquations,简称N-S方程组)虽然精确,但其求解却相当耗时,无法满足实时计算的需求。JosStam在计算机图形学领域中引入半拉格朗日算法,才使得实时流体计算成为可能。该方法虽然在计算精度上不能满足工程上的应用,但能捕获流体运动的基本特征,很好地满足视觉要求。所以,计算机图形学界逐渐开始广泛使用该方法来模拟流动现象。本文探讨了将JosStam的二维平面流体模拟算法应用到三维空间,并利用OpenGL三维纹理实现的直接体绘制方式显示模拟结果的方法;同时以对烟雾扩散模拟的实时绘制为例,对比传统的结合粒子系统与公告牌技术模拟方法,分析使用直接体绘制方法在显示效果上的优势所在。2相关工作2.1二维空间中流体模拟物理学界早在19世纪中叶就已推导出精确的流体力学方程,其中最有名的便是N-S方程组。该方程组是牛顿第二定律在不可压缩粘性流动中的表达式,是法国力学家、工程师C.-L.-M.-H.纳维于1821年创立,经英国物理学家G.G.斯托克斯于1845年改进而确定的。它的基本形式为:式中分别为液体密度、运动粘性系数、动水压强、流速矢量、单位质量;▽为矢量微分算符;为拉普拉斯算符;2wtu为指定点处由于时间改变而引起的速度变化率,称为当地加速度;(wu·▽)wu为指定瞬时由于空间位置改变而引起的速度变化率,称为迁移加速度;k▽2ρ和ν▽2wu分别为作用于单位质量液体表面的合压力与合粘性力。依据N-S方程组,可以将流体分解为N*N*N的离散的速度场和密度场,通过设定一定的时间步长,进行有限的迭代,求解流体的状态。但N-S方程组得求解相当耗时,且在时间步长较大时易发散,无法满足实时计算的稳定性需求。直到JosStam引入了半拉格朗日插值算法,填补了实时显示的计算瓶颈。文献[1]介绍了JosStam算法在N*N的二维平面中的流体模拟的具体实现。参照N-S方程组的速度方程,算法将作用于速度场每个wf均匀分解到场内的各个单元中,计算出各单元的流速矢量。此后Stam通过对各单元格与其相邻格的密度值进行加权平均,模拟密度的扩散。该方法回避了复杂的N-S密度方程,虽然损失了计算精度,却从而大大提高了运算速度,因而在游戏和展示等不要求工程精度的领域中得到了广泛的应用。对模拟算法的改进和新的计算方法的引入也成为研究的热点:早期1983年Reeves[2]提出的粒子系统的方法对于模拟外形不断变化的流体具有相当强的表现力,文献[3]利用粒子系统的方法实现了瀑布的实时模拟,在普通PC上即可获得实时的绘制速度和真实的外观效果,文献[4]描述了一种利用八叉树进行计算流体数据场划分显示的方法,通过将数据场进行分块计算,减少CPU的负担;文献[5]描述了一种利用GPU辅助进行CPU并行计算的方法,但由于显卡内存限制无法计算过大纹理。2.2基于硬件的三维纹理绘制技术SGI在2000年一月发布的OpenGL1.2.1开发包中,就已包含了对于实现三维纹理的扩展指令(glext.h)支持;且从nVidia的GeForce3Ti系列显卡开始,各种型号的图形显卡也均支持三维纹理硬件绘制方法[6]。使得基于硬件的体绘制方法日趋走向成熟,并拥有广泛的编程语言支持。硬件支持的三维纹理直接体绘制主要由以下三步组成[7](如图所示):(1)纹理生成:三维纹理体数据与二维纹理相同,由一些的体素点组成的序列决定,但由于是维度增加,确定体数据所需要的体素点数量也高出一个数量级,因此纹理尺寸不宜过大。通过OpenGL的扩展指令,便可以这些数据装入纹理内存,形成三维纹理。(2)三线性插值(重采样):在纹理空间内定义一定数量采样层,这些层彼此平行且与视线方向垂直。由于层间的间隔及其采样密度与原始数据不同,因此必须通过硬件的三线性插值即重采样,才能获得这一系列平行层平面上各采样点的数值。采样层的数量直接关联到下一步的合成效果,层数较少会产生严重的边缘锯齿,而层数过多会影响绘制速度。(3)图像合成:首先将采样层上各采样点的数值按照给定的传递函数转换为相应的颜色值和不透明度值。然后设置相应的轮廓剪切面,再根据适当的混合函数,利用硬件的混合及消隐功能,按照从后向前的顺序进行合成投影于视平面而形成最后的图像。该方法中重采样和合成过程都由硬件完成,因而大大节省了绘制时间,得到广泛的应用。3流体模拟的可视化方法结合流体模拟和三维纹理的相关技术,本文尝试编程实现基于三维纹理的流体模拟。主要过程分以下四步(图1):(1)扩展到三维算法:参考第二节中的二维空间模拟算法,通过增加数据场的维度,可以推导出三维空间的流体模拟算法。将空间划分成N*N*N个体单元,在速度矢量中u,v分量的基础上加入w方向分量,并将计算结果加入影响密度计算系数的权值。在密度计算中,需要计算单个体单元与空间位置上的六个邻格的加权平均,得出三维空间中体单元点密度的扩散值。由于将二维平面扩展到三维空间使得数据的存储量上升了N倍,计算量也增加了N,因此在体单元数量一定的情况下,无法达到二维流体模拟的高分辨率。(2)建立由密度场到三维纹理体素的映射:由于在中等的机器配置上,已无法达到超过20*20*20大小以上的纹理计算的实时性,而硬件所支持的三维纹理却远大于该尺寸,并且部分显卡要求纹理的尺寸为2的幂数。因此为充分发挥显卡的显示性能,本文从流体密度场单元格到相应三维纹理的体素进行插值映射,通过线性插值算法,将密度映射到相应的体素中。(3)建立光照模型,计算光照:光照是真实感模型的重要组成部分,能够即时处理光照也是三维纹理区别于传统粒子系统的另一大优势。为了简化计算,我们采用如下方法:由于对纹理中每个体素的颜色和alpha值均进行了存储,通过由光源发出的射线扫描该存储矩阵,记录并处理所经过体素的alpha值,并依次对扫描线经过各点的色彩进行赋值,以形成明暗效果,如图2(e)所示。(4)配置三维纹理及显示:完成计算和光照处理后,须要将计算后的矩阵配置成三位纹理,并将该纹理绑定于相应的实体空间。通过设定相应的剪切面,确定显示包围盒。设定完成后转交OpenGL完成绘制。相对流体模拟的计算时间,纹理分配和绘制时间可以忽略,因此重复地分配新的纹理并不影响整体效果。4系统实现与比较本文所使用程序编译平台为VC++6.0,图形引擎为OpenGL,硬件平台为中等配置AMDAthlonXP2500+(Barton核心)、512MDDR400、GeForce4Ti4200(AGP8X、核心频率250MHz、显存64MB、驱动版本67.66)。a)二维空间流体速度场b)三维空间流体速度场(喷发状态)c)三维空间流体密度场d)映射后的三维纹理e)光照模型图1基于三维纹理的三维空间流体模拟过程图2展示了本方法在烟雾模拟中的某一时刻三个角度的显示结果,图中对比展示了基于粒子系统的烟雾模拟。可见相比较来说,粒子系统的物理模拟简单,轮廓感较严重,且基于公告牌技术的显示导致各个方向看到的粒子外观相同,为避免该问题,只有增加粒子纹理种类和粒子数量,消耗更多资源;而使用三维纹理不但有效地避免了粒子系统的轮廓感问题,而且纹理的旋转插值由硬件完成,不需要占用CPU时间,尤其是可以对各个体素进行灵活自定义,实现用户所需要的渲染效果。但是由于结构复杂,计算三维纹理需要较长的时间,影响的显示速度,使显示精度受到限制。a)基于三维纹理的烟雾模拟界面及某时刻截图c)基于粒子系统的烟雾模拟(粒子数100)b)图a时刻的另两个方向截图d)基于粒子系统的烟雾模拟(粒子数500)图2基于三维纹理与基于粒子系统的烟雾显示对比5总结与展望因此基于三维纹理的流体显示比基于粒子系统的显示具有更好的空间层次感,可以达到更好的模拟效果,同时该方法原理上弱化了显卡功能的图形处理功能,仅将显卡作为独立的处理器使用。因此相信随着硬件计算能力的进一步提高和算法的更新,三维纹理的速度劣势会不断缩小,从而发挥出其的应有的表现力。
本文标题:基于三维纹理的实时流体模拟1
链接地址:https://www.777doc.com/doc-2573097 .html