流体模拟
流体模拟是指通过数学模型和计算机算法来模拟流体行为的过程。它可以用来研究和预测各种液体和气体的运动、相互作用和变形。
流体模拟有多种方法,下面列举了几种常见的方法:
-
网格方法:网格方法是最常用的流体模拟方法之一。它将模拟区域划分为一个或多个离散的网格单元,并根据流体的性质和运动方程,在网格点上进行数值计算。其中包括有限差分法、有限体积法和有限元法等。
-
粒子方法:粒子方法,如经典的分子动力学方法(Molecular Dynamics, MD)和格子Boltzmann方法(Lattice Boltzmann Method, LBM),将流体看作由大量微观粒子组成的系统。通过模拟粒子之间的相互作用,可以推断宏观流体的行为。
-
边界元方法:边界元方法是一种基于势函数和其法向导数在流体边界上的离散化表示,以求解流体行为的方法。它将流体问题转化为求解边界上的边界积分方程,通过边界条件求解得到流体的速度和压力等参数。
-
体积随机方法:体积随机方法将流体看作是由大量微小的体积元素组成的系统,每个体积元素具有随机的速度和位置。通过跟踪每个体积元素的运动,可以模拟流体的行为。常见的方法包括随机分子动力学方法(Random Molecular Dynamics, RMD)和多粒子碰撞动力学方法(Multiparticle Collision Dynamics, MPCD)。
本文实现的是利用网格方法来进行的流体模拟。
具体实现
实现原理参考文章Fast Hydraulic Erosion Simulation and Visualization on GPU。
简单的概括可以分为以下几个步骤实现:
- 获取一张模拟范围的高度图,在 Cesium 中就是一张包含分析范围的,从上往下看的深度图。
- 创建两张纹理缓冲区,用于存放前后两帧地形的高度 ( 根据高度图获取 ) 和水面的高度。
- 创建两张纹理缓冲区,用于计算前后两帧每个像素上的水往上下左右四个方向的流出量。
- 编写着色器,利用乒乓渲染的方式交替更新高度缓冲区和流出量缓冲区的内容。
- 单独编写一个着色器,根据其中一张高度缓冲区渲染流体计算结果。
优缺点
利用这种方式实现的流体模拟由于计算方式简单,因此可以对性能的消耗较小。
但是由于水面流动是利用高度图计算的,而高度图中只记录了场景的最大高度,因此对于 “上宽下窄” 或者 “下面镂空” 这类的情况,水面会无法填充这些空余的部分。
具体效果
Cesium流体模拟(美化一下水面)
原文链接
Cesium中实现流体模拟