参考资料: RWTH Aachen university(亚坦工业大学)的sph教程
前言
流体模拟的研究学习博客中,我先阐述流体模拟的数学方法,再阐述流体模拟引擎splishsplash的架构和实现,使用方法。
物理仿真是视觉计算中的一个重要研究课题。它具有许多应用,包括虚拟原型,培训模拟器,机器人,用于数字制作的动画软件,包括电影和动画电影中的视觉效果以及计算机游戏。
我希望这些示例及其文档能帮助您了解仿真方法。随意在您自己的课题中使用这些示例。
粒子系统
-
简单粒子系统的实现步骤
-
除去使用寿命>最长使用寿命的颗粒
通过发射器生成新粒子
计算所有粒子的力
时间积分以获得新的粒子位置和速度
-
去除使用寿命>最长使用寿命的颗粒
生成粒子时,每个粒子的生存期设置为 0。在每个仿真步骤中,寿命会随着时间步长的增加而增加δ吨.当粒子的生存时间大于预定义的最大生存期时,将从模拟中删除该粒子。生存期可用于渲染效果。在我们的例子中,透明度根据颗粒淡出的使用寿命而增加。 -
发射器生成新粒子
在每个仿真步骤中,都会在发射器的位置生成新的粒子。通常,它们使用一些预定义的值进行初始化,有时还会添加一些随机值以获得更自然的结果。在我们的模拟中,粒子以朝上的速度生成。此外,x和y方向的速度由一些随机值修改。
-
计算所有粒子的力
在每个步骤中,确定粒子的力,例如重力,风等。在我们的简单示例中,仅应用重力 -
粒子关于时间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}
δ(r−r0)={∞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′)δ(x−x′)dv
根据狄拉克恒等式,我们可以选择一个核函数W(x)则有:
W
(
x
)
≈
(
W
∗
δ
)
(
x
)
W(x)\approx(W*\delta) (x)
W(x)≈(W∗δ)(x)
其中Rd是高斯核,对于高斯核N满足以下等式,图为推导
核函数W(x)的性质
实际使用较少,需要时查表自取。
通过核函数逼近(泰勒展开式)
(
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'}
(A∗W)(x)=∫[A(x)+∇A∣x⋅(x′−x)+∇∇21(x′−x)+O(∥r∥3)]W(x−x′,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(x−x′)dv′+∇A∣x∫⋅(x′−x)W(x−x′)dv′+O(∥r∥2)
这个积分式的结果可以表示为
(
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'}}
(A∗W)(xi)=∫ρ(x′)A(x′)W(xi−x′,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)= <A(x_i)>
(A∗W)(xi)≈j∈F∑AjρjmjW(xi−xj,h)=<A(xi)>