- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于OpenGL流体交互式仿真
基于OpenGL流体交互式仿真
摘 要:为避免二维波方程中的大量计算,使用二维波动方程的中心差分近似来模拟流体运动。在该方法上实现了基于物理的浮力和阻力模型,模拟物体在流体表面的漂浮。在OpenGL上实现上述方法,实验证明该方法实现简单,大大降低了运算代价。??
关键词:虚拟现实;流体;波动;栅格; 仿真??
中图法分类号:TP391.9文献标识码:A
文章编号:1001―3695(2007)02―0186―03
近几年来,随着计算机硬件技术和计算机图形学、三维仿真、虚拟现实等技术的快速发展,实时模拟真实的室外环境成为可能,而动态的流体对任何室外游戏场景都可以增加极大的美感。国内外的学者对流体模拟进行了许多研究,如Trim [1]将水面看作一个绷紧伸展的弹性膜,忽略其重力,采用偏微分和积分来模拟水面,但这种方法计算量大。Press将流体表面分隔为大小平均的栅格,将上述积分变化为离散操作,利用快速傅里叶变换(FFT)进行计算,成功地简化了上述方法,但在交互式应用中,如果栅格较大,其计算代价也高得惊人[2]。采用纹理映射中对纹理矩阵操作的方法可以非常简单地实现浮动的海面[3],但逼真度低且无法实时模拟物体在水面上的移动情况。通过计算级数中重要的项也可以得到近似解,虽然该方法直接且稳定,但效率很低。因为大多数的CPU计算一个三角函数要用大约30个周期,即使沿x,y方向仅取三个频率最大的值,每个时间间隔每一点也要计算九个正弦函数,对于交互应用中较大的栅格其代价更高。为减少运行的代价且方便实现与水面漂浮物体的交互,本文通过使用二维波动方程的中心差分近似,使每个点仅用几个算术运算就能模拟流体表面的水平运动。在这种表面的基础上,对漂浮物体进行受力分析,实现了物体在水面中的交互式模拟。??
1 流体表面的模拟实现??
流体的仿真一般采用如下的二维波方程:??
其中常数c代表每单位时间位移的距离,即流体的速度;μ为非负常数,代表流体的黏性,该值大体上决定了波在一种表面上传播的距离,也就是波消失的时间。较小的μ值可以让波存在时间较长,适合模拟水波;较大的μ值会导致波的快速消失,如黏稠的油波。
本文假设边界条件是齐次的(即边缘不作上下运动),且流体表面的初始速度为0,对于一个L×L大小的正方形流体表面用三角形网格连接,网格的顶点排列成平均分隔的栅格,如图1所示。式(1)的二维波方程可以用分离变量的解析方法求解,但其求解过程十分复杂、效率低,在实时仿真时需要相当大的计算量。为简化运算,采用近似导数方法模拟波在流体表面的传播过程。??
1.1 波动的模拟偏导数实现
1.2 不稳定性的限制
1.3 边界的反射
水域通常不是正方形的,河流、湖泊和海洋有着不同斜度的不规则海岸线,而且岛屿也可能存在于水域内部。如果水岸非常陡峭甚至是垂直的,波浪从海岸线反射回来就几乎不会失去能量;然而如果水岸是倾斜的,波浪的反射波可能会非常弱,或根本没有。如果波浪不是垂直击向岸边,那么就会以某个角度反射回来。可以通过一个本地阻尼系数di, j调节zn+1的值来模拟。系数为1表明允许在高度值上自由运动而不损失任何能量;系数为0代表限制在那个位置水域的所有运动。如果这些系数是根据地形特征来分配和调节的,波浪对海岸线做出的反应就更自然。例如,如果海岸是陡峭的,阻尼系数就应该从1(水)到0(陆地)作一个快速的转变;如果海岸是逐渐倾斜的,阻尼系数就应该从1渐变到0。实际上,将略小于1的阻尼系数用于“湿的”栅格比较好,可以产生较少的能量损耗;否则波动会无限地延续下去。
1.4 算法的具体实现??
为避免在时刻t-1,t0,t1的Z值存储三个栅格,将zn-1被zn+1适当代换,只需要两个栅格, 通过在传递结束时,指向zn+1和zn的值的内存指针进行交换实现。因此开辟两个缓冲区,每一个为包含n×m个顶点位置的数组。在显示每一帧时,包含当前顶点位置的缓冲区称为当前缓冲区,包含上一时间段的顶点位置的缓冲区称为旧缓冲区。在计算顶点的新位移时,需要用新的顶点位移更新旧缓冲区中的顶点位置,则当前缓冲区成为下一帧中的旧缓冲区,而旧缓冲区则成为下一帧中的当前缓冲区。这样,交替使用这两个缓冲区进行流体表面的显示。??
2 与水面交互??
为真实模拟水面波动,必须模拟水面波动的开始(即水面的飞溅效果)和漂浮物体随水面浮动的效果。
2.1 飞溅??
飞溅的效果可以通过在特定位置瞬时移动一个或几个Z值来创建。当一个物体与流体表面接触时(如投掷一块砖头)会引起流体表面的振动,这时流体表面的位置可以通过修改接触点周围顶点的位移直接得到。将离接触点最近的点压缩为一点可以获得满
原创力文档


文档评论(0)