光滑粒子流体动力学_基于SPH(光滑粒子流体动力学)算法的流体仿真
實現(xiàn)的效果很粗糙,沒有添加渲染和表面繪制,現(xiàn)在只做到了點和線的程度。這個月考試比較多,所以做的時間也沒有很多。
先放一下最終的效果圖。
碰撞檢測的粒子碰撞后速度的計算還有有些問題的,碰撞檢測做的比較簡單。有時間了再單獨修改碰撞檢測方面的內容,先把流體仿真實現(xiàn)了再說。
沒有表面構建,也看不出來具體是不是有什么問題(但是粗略的看除了上邊幾個粒子不動了,也沒有什么太大的問題,可能就是碰撞時候出的問題?有空再多看看相關的資料),構建表面時候還是會整體進行修改的。
在介紹SPH算法之前,首先我們先了解一些數(shù)學原理。
偏導數(shù)
若z=f(x,y),則z對x的偏導數(shù)為:
同理對y的偏導數(shù)只要將x改為y即可。
哈密頓算子
哈密頓算子?在流體力學中非常重要,這里介紹一下哈密頓算子,所謂“算子”,就是那種不能單獨存在,必須和其他符號放在一起的一種數(shù)學符號,例如微分中的那個“d”。哈密頓算子的定義如下:
哈密頓算子有很多有趣的特性,它本身雖然并不是一個矢量,但很多運算確實可以把它視為一個矢量,例如把它作用在一個標量場A=f(x,y,z)上,那么
這個運算可以視為一個矢量和標量的乘法,得到的?A是一個矢量場,稱為A的“梯度”,梯度的含義就是標量場A在某處變化快慢和方向,比如一個標量場H(x,y)是一座高山在(x,y)處的高度,則H的梯度是該高山在某處陡峭的程度,并且方向指向高處。
下面兩個圖中,標量場是黑白的,黑色表示大的數(shù)值,而其相應的梯度用藍色箭頭表示:
而如果把哈密頓算子作用在一個矢量場A上,得到的??A稱為矢量場A的“散度”,散度的計算和矢量的點積運算相似,得到的是一個標量場。
散度的意義就是描述一個矢量場“發(fā)散”的程度,例如下面的兩個矢量場,左邊的有很大的散度,而右邊的散度為0。
拉普拉辛算子
拉普拉辛算子?2是二階微分算子,有時也可寫作Δ或者???
例如對于A=f(x,y,z):
接下來是粒子的受力分析。
SPH算法的基本思想就是將連續(xù)的流體看成許多個相互作用的粒子,通過粒子之間的相互作用形成了復雜的流體運動。每個粒子都有自己的基本屬性,包括位置、速度、質量、所受的重力、壓力、粘力等等。并且除質量外都要每一幀進行重復計算。
對于每個粒子,都遵循基本的牛頓第二定律。
F = ma;
在SPH算法里,流體的質量是由流體單元的密度決定的,所以一般用密度代替質量:
在這里,粒子所受的力我們只研究三個,分別是重力、壓力以及粘力。
試想一下在水管中流動的液體,進水口區(qū)域的壓力一定會比出水口區(qū)域大,所以液體才會源源不斷的流動,數(shù)值上,它等于壓力場的梯度,方向由壓力高的區(qū)域指向壓力低的區(qū)域。
粒子之間的粘力是由粒子之間的速度差引起的,設想在流動的液體內部,快速流動的部分會施加類似于剪切力的作用力到速度慢的部分,這個力的大小跟流體的粘度系數(shù)μ以及速度差有關。
將上述三個力結合起來,就得到
加速度則為
光滑核函數(shù):
sph算法中每個粒子的光滑核函數(shù)我們可以理解為:在光滑核半徑內,粒子受到的力受到粒子之間距離的影響,距離越近受到的影響越大。具體形式如下圖:
我們將流體看成多個粒子的集合,每個粒子都受到周圍粒子的影響,
我們看系統(tǒng)中的某個粒子,他到臨近的粒子的距離分別為r1,r2......rn,則所觀察粒子受到的影響即為每個粒子帶來的影響之和。這個屬性可以是任何需要疊加的屬性,比如密度、壓力、粘度等。
其中Aj是要累加的某種屬性(如密度,壓力,粘度)。其中m是粒子的質量,ρ是粒子的密度。r是粒子的位置,h是光滑核半徑,W就是光滑核函數(shù)。
對于SPH算法來說,基本流程就是這樣,根據(jù)光滑核函數(shù)逐個推出流體中某點的密度,壓力,速度相關的累加函數(shù),進而推導出此處的加速度,從而模擬流體的運動趨勢,下面依次分析密度,壓力,粘度的求解。
密度
根據(jù)上述公式,用密度ρ代替A,可以得到
計算使用的光滑核函數(shù)稱為Poly6函數(shù),具體形式為:
其中
是一個固定的系數(shù),根據(jù)光滑核的規(guī)整屬性,通過積分計算出這個系數(shù)的具體值,3D情況下,在球坐標中計算:
由于所有粒子的質量相同都是m,所以在3D情況下,所研究粒子的密度為:
壓力
同樣,我們用p代替A,就會求得我們所需要的壓力公式。
由于位于不同壓強區(qū)的兩個粒子之間的作用力不等,所以計算中一般使用雙方粒子壓強的算術平均值代替單個粒子由壓力產生的作用力的計算公式為:
對于單個粒子產生的壓力p,可以用理想氣體狀態(tài)方程計算:
其中ρ0是流體的靜態(tài)密度,K是和流體相關的常數(shù),只跟溫度相關。壓力計算中使用的光滑核函數(shù)稱為Spiky函數(shù):
在3D情況下,
Kspiky = 15/(πh6),即
由此我們可以整理出公式中壓力產生的加速度部分:
粘度
公式最后一部分,由粘度產生的作用力:
這個公式同樣有“不平衡”的問題,考慮到公式中的速度其實并不是絕對速度,而是粒子間的相對速度,所以這個公式的正確寫法應該是:
其中的光滑核函數(shù)形式如下:
在3D情況下,Kviscosity = 15/(2πh3),由此我們可以得到:
由此可得到的粘度部分加速度:
到這里,根據(jù)我們已經獲得的數(shù)據(jù),我們就可以計算最后的加速度了:
我們所需要的理論,都已經介紹完了,在搞懂這些之后就可以編寫代碼,實現(xiàn)我們自己的流體仿真了。
具體的代碼我已經上傳到我的git上,項目地址:
wangfeng70117/fluid_simulation?github.com總結
以上是生活随笔為你收集整理的光滑粒子流体动力学_基于SPH(光滑粒子流体动力学)算法的流体仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7电脑连接到网络的图标不见了怎么办
- 下一篇: 磁盘里有文件怎么分区吗 磁盘如何对文件进