流体模拟引擎splishsplash 数学方法

参考资料: RWTH Aachen university(亚坦工业大学)的sph教程

文章目录

  • 前言
  • 粒子系统
  • 基础数学
    • 狄拉克函数
    • 狄拉克恒等式
      • 核函数W(x)的性质
    • 通过核函数逼近(泰勒展开式)


前言

流体模拟的研究学习博客中,我先阐述流体模拟的数学方法,再阐述流体模拟引擎splishsplash的架构和实现,使用方法。

物理仿真是视觉计算中的一个重要研究课题。它具有许多应用,包括虚拟原型,培训模拟器,机器人,用于数字制作的动画软件,包括电影和动画电影中的视觉效果以及计算机游戏。

我希望这些示例及其文档能帮助您了解仿真方法。随意在您自己的课题中使用这些示例。


粒子系统

流体模拟引擎splishsplash 数学方法_第1张图片

简单粒子系统的实现步骤
除去使用寿命>最长使用寿命的颗粒
通过发射器生成新粒子
计算所有粒子的力
时间积分以获得新的粒子位置和速度
  1. 去除使用寿命>最长使用寿命的颗粒
    生成粒子时,每个粒子的生存期设置为 0。在每个仿真步骤中,寿命会随着时间步长的增加而增加δ吨.当粒子的生存时间大于预定义的最大生存期时,将从模拟中删除该粒子。生存期可用于渲染效果。在我们的例子中,透明度根据颗粒淡出的使用寿命而增加。

  2. 发射器生成新粒子
    在每个仿真步骤中,都会在发射器的位置生成新的粒子。通常,它们使用一些预定义的值进行初始化,有时还会添加一些随机值以获得更自然的结果。

    在我们的模拟中,粒子以朝上的速度生成。此外,x和y方向的速度由一些随机值修改。

  3. 计算所有粒子的力
    在每个步骤中,确定粒子的力,例如重力,风等。在我们的简单示例中,仅应用重力

  4. 粒子关于时间t的积分公式 包括速度v,位移x,旋转角度α,已知粒子质量m与角速度ω
    V ( t + Δ t ) = V ( t ) + Δ t m V(t+\Delta t)=V(t)+\frac{\Delta t}{m} V(t+Δt)=V(t)+mΔt X ( t + Δ t ) = X ( t ) + Δ t V ( t + Δ t ) X(t+\Delta t)=X(t)+\Delta tV(t+\Delta t) X(t+Δt)=X(t)+ΔtV(t+Δt) α ( t + Δ t ) = α ( t ) + Δ t ω \alpha(t+\Delta t)=\alpha(t)+\Delta t\omega α(t+Δt)=α(t)+Δtω

基础数学

狄拉克函数

δ ( r ) = { ∞ r=  0 0 otherwise  d \delta(r) = \begin{cases} ∞ &\text{r= } 0 \cr 0 &\text{otherwise } d \end{cases} δ(r)={0r= 0otherwise d
Dirac−δfunction称狄拉克函数,通常用于表示质点。质点只有距离刚好相等时才会出现反应,在该函数中r=0不一定是无穷大,也可以是一个常数,此外如果函数在r≠0的常数点取无穷(或常数)时表示为
δ ( r − r 0 ) = { ∞ r=  r 0 0 otherwise  d \delta(r-r_0) = \begin{cases} ∞ &\text{r= } r_0 \cr 0 &\text{otherwise } d \end{cases} δ(rr0)={0r= r0otherwise d

狄拉克恒等式

A ( x ) = ( A ∗ δ ) ( x ) = ∫ R d A ( x ′ ) δ ( x − x ′ ) d v A(x)=(A*\delta) (x)=\int_{R^d}{A (x')\delta(x-x')dv} A(x)=(Aδ)(x)=RdA(x)δ(xx)dv
根据狄拉克恒等式,我们可以选择一个核函数W(x)则有:
W ( x ) ≈ ( W ∗ δ ) ( x ) W(x)\approx(W*\delta) (x) W(x)(Wδ)(x)

其中Rd是高斯核,对于高斯核N满足以下等式,图为推导
在这里插入图片描述
流体模拟引擎splishsplash 数学方法_第2张图片

核函数W(x)的性质

流体模拟引擎splishsplash 数学方法_第3张图片
实际使用较少,需要时查表自取。

通过核函数逼近(泰勒展开式)

( A ∗ W ) ( x ) = ∫ [ A ( x ) + ∇ A ∣ x ⋅ ( x ′ − x ) + ∇ ∇ 1 2 ( x ′ − x ) + O ( ∥ r ∥ 3 ) ] W ( x − x ′ , h ) d v ′ (A*W) (x)=\int{[A(x)+\nabla A\vert_x·(x'-x)+\nabla\nabla\frac{1}{2}(x'-x)+\Omicron(\lVert r \rVert^3)]W(x-x',h)dv'} (AW)(x)=[A(x)+Ax(xx)+∇∇21(xx)+O(∥r3)]W(xx,h)dv
= A ( x ) ∫ W ( x − x ′ ) d v ′ + ∇ A ∣ x ∫ ⋅ ( x ′ − x ) W ( x − x ′ ) d v ′ + O ( ∥ r ∥ 2 ) =A(x)\int W(x-x')dv'+ \nabla A\vert_x \int ·(x'-x)W(x-x')dv'+\Omicron(\lVert r \rVert^2) =A(x)W(xx)dv+Ax(xx)W(xx)dv+O(∥r2)
这个积分式的结果可以表示为
( A ∗ W ) ( x i ) = ∫ A ( x ′ ) ρ ( x ′ ) W ( x i − x ′ , h ) ρ ( x ′ ) d v ′ ⏟ dm’ (A*W) (x_i)=\int \frac{A(x')}{\rho(x')}W(x_i-x',h)\underbrace{\rho(x')dv'}_{\text{dm'}} (AW)(xi)=ρ(x)A(x)W(xix,h)dm’ ρ(x)dv
( A ∗ W ) ( x i ) ≈ ∑ j ∈ F A j m j ρ j W ( x i − x j , h ) = < A ( x i ) > (A*W) (x_i)\approx\sum_{\substack{j\in F}} A_j \frac {m_j}{\rho_j}W(x_i-x_j,h)= (AW)(xi)jFAjρjmjW(xixj,h)=<A(xi)>

你可能感兴趣的:(计算机图形学,人工智能)