pep8代碼格式化 可以使用yapf
導出gif文件
Lagrangian View
節點隨着材質一起動,每個節點是一個sensor
一般是粒子
Eulerian View
每個節點都是固定不動的,是still sensor that never move
穿過我的材料速度是多少
歐拉里的格點的位置是不用記的,而歐拉的點位置要記錄
Mass-Spring System
stiffness 硬度 對抗變形的能力,胡克定律的k
damping 阻尼 小了會不停的晃動 一般是給彈簧加damping
胡克定律 + 牛頓第二定律
常微分方程
計算機的積分,時間是離散的,需要取一個dt ,大一點算的快但是會有不穩定的問題
dt內速度和質量都是常數,前兩個的區別是預測位移時使用的速度不一樣,后者有一些守恆的性質
back Euler+牛頓方法 得到隱式歐拉
1、計算力和速度
2、處理碰撞
3、處理位移
顯式積分和隱式積分
顯式積分的未來只取決於過去,
易於實現,容易爆炸(對dt),對比較硬的材料不是很適合
爆炸:計算誤差無法隨時間衰減,而是隨時間爆炸性增長
有數值穩定性的約束
后向歐拉 隱式時間積分,未來取決於過去和未來,雞蛋問題,每一個timestep變昂貴,難實現,難優化,timestep可以更大
有好處也有壞處
f(x)一般是非線性的,如果有非線性方程就比較難解,轉換成線性的方程
線性化用到了一階泰勒展開
解線性系統
-
jacobi 迭代 最簡單
-
gauss-seidel 迭代 更快
-
共軛梯度
最后一個錯了 B = 1
求矩陣的逆是非常昂貴的操作,大的矩陣不推薦求逆
有非常多的粒子怎么辦?
- 稀疏矩陣
- 共軛梯度
- 預條件
- 基於位置的運動學
拉格朗日解流體粒子方法 SPH
一堆粒子攜帶物理量,使用核函數近似一個連續的場
在x這一點,物理場的值用核函數去求周圍的粒子的作用,接近這個粒子的貢獻的多,遠離這個粒子的貢獻少
速度、density、pressure
一開始是用來模擬天體物理
優點:不需要mesh,自由表面(水和空氣的有明確的表面,煙霧是分散於空氣中的沒有明確的表面),每一個粒子是一滴水,然后被其他水滴作用
WCSPH weekly compressible SPH 可壓縮的流體模擬(入門)
Dv稱為材料倒數,跟着粒子動的倒數,和小d不同
壓強梯度除密度為內力,g為外力,v就是速度了
壓強的表示,狀態方程
B:bulk modulus \(\rho_0\)是一個理想密度,密度很大壓強就很大,壓強很高就會嘗試推着周圍的粒子離開自己
粒子的\(\rho\)是就算周圍的粒子的質量加權來算的
A計算每一個粒子的所在位置的物理量的多少,任意的粒子物理屬性,一個加權平均,應該把它看做一條公式
算梯度的多方法,sph做的不是很好
計算通用屬性的公式:
SPH也可以比較方便的加表面張力加粘度
SPH計算:
1、對每個粒子計算它所在位置的密度
2、對每個粒子計算它的壓強梯度,進而得到它的Dv/Dt
3、Symplectic Euler Step
有很多的變種
PCI - SPH 有隱式的SPH,但不完全是隱式的,有預測的做法,不斷的校正
Position-based fluid PBF 實時的PBD + SPH 的模擬流體的方法
Divergence-free SPH 指的是速度場無分離,接近一種不可壓縮流體的方法
顯示時間積分的條件
CFL condition
從材料剛度有考慮時間步長限制
從粒子運動速度來考慮時間步長限制
各模擬都要遵循這個條件,我們要取這個Cmax
需要加速SPH,時間復雜度O(n^2)n可能達到百萬
實際中我們會使用一些特殊的數據結構(voxel grid)來加速對相鄰的粒子的search達到復雜度O(n)
對每一個粒子要精確的找到和他比較近的所有粒子 只要loop比較近的粒子,維護一個grid,每一個格子維護自己內部有哪些粒子,每次我們要尋找周圍的粒子時先找自己格子和自己周圍一定距離格子,然后遍歷這些格子維護的粒子
還有很多其他的加速方法
SPH論文:
R. A. Gingold and J. J. Monaghan (1977). “Smoothed particle hydrodynamics: theory and application to non-spherical stars”. In: Monthly notices of the royal astronomical society 181.3, pp. 375–389.
J. J. Monaghan (1994). “Simulating free surface flows with SPH”. In: Journal of computational physics 110.2, pp. 399–406.
其他的粒子法:
DEM discrete element method 每一個粒子都是一個剛體小球,可以模擬沙子
MPS moveing particle semi-implicit
PP power particle
導出gif
https://taichi.readthedocs.io/en/latest/export_results.html#export-your-results
流固耦合
解線性系統聯立求解就是強耦合
先解流體然后把流體作為剛體的邊界條件解剛體,然后把解出來的剛體作為邊界條件解流體
SPH有一個很好模擬各種介質的耦合,流體、彈性物體、剛體
從粒子生成表面的mesh
marching cube
隊伍格子上面的點去算一下他的密度,然后嘗試畫出他的值為0的一個等勢面,等勢面就是用三角網格去近似的
有很多種情況,這里給了14種
marching cube 有 很多的預處理 smooth操作
openVDB 有smooth operator
先把粒子光柵化到一個背景網格上,然后背景網格上做一個根據距離場的圓滑或者尖銳,得到一個density field然后就可以使用marching cube
實時應用:屏幕空間渲染,一種近似,但鏡頭動的比較大就比較麻煩