彈簧質點模型是利用牛頓運動定律來模擬物體變形的方法。如下圖所示,該模型是一個由m×n個虛擬質點組成的網格,質點之間用無質量的、自然長度不為零的彈簧連接。其連接關系有以下三種:
1.連接質點[i, j]與[i+1,j],[i, j]與[i,j+1]的彈簧,稱為“結構彈簧”;
2.連接質點[i, j]與[i+1,j+1],[i+1,j]與[i,j+1]的彈簧,稱為“剪切彈簧”;
3.連接質點[i, j]與[i+2,j],[i, j]與[i, j+2]的彈簧,稱為“彎曲彈簧”。
這三種彈簧分別用於與結構力(拉力或壓力)、剪力和彎矩相關的計算。
彈簧質點運動時受到內力和外力和影響,內力包括彈簧的彈性力和阻尼力,外力包括重力以及空氣阻力等。
彈簧的彈性力遵從Hooke定律,質點i和質點j之間的彈性力可以表示為:
其中:,
,ks表示彈性系數,xi表示質點i的位置,l0表示彈簧的自然長度。
彈簧的阻尼力與質點相對速度在彈簧方向上的分量成正比,可以表示為:
其中:vij = vj – vi,kd表示阻尼系數,vi表示質點i的速度。
牛頓運動定律是彈簧質點模型的關鍵,將該二階微分方程改寫成兩個一階微分方程:
(1)
利用顯式歐拉積分求解上述微分方程可以得到:
(2)
整個過程的偽代碼如下:
顯式歐拉積分表示簡單,求解快速,但其對積分步長有限制,一旦超過某個臨界值T0時,積分結果就會發散。而臨界值T0主要與彈簧的彈性系數有關,彈簧的彈性系數越大,臨界值T0就越小,對應的步長也越小,這就意味着兩個可視幀之間需要更多次的迭代才能使結果穩定。
一種提高積分精度的方法是采用四階Runge-Kutta積分,其精度能達到O(h4):
整個過程的偽代碼如下:
隱式歐拉積分比顯式歐拉積分具有更高的穩定性,彈簧質點模型的隱式歐拉積分表達式如下:
(3)
將ft+h一階泰勒展開,代入式(3)第一個微分方程得到:
整理得:
兩邊乘以M:
上式中M是以3×3對角矩陣為子矩陣的對角矩陣,兩個Jacobian矩陣和
都是子矩陣為3×3的對稱稀疏矩陣,只有當質點i和質點j之間有彈簧連接時對應的子矩陣才非零(對角線也非零)。隱式歐拉積分需要求解線性方程組來得到下一時刻狀態,但是穩定性好,能夠取較大的步長進行計算。
參考文獻:
[1] David Baraff and Andrew Witkin. 1998. Large steps in cloth simulation. In Proceedings of the 25th annual conference on Computer graphics and interactive techniques (SIGGRAPH '98). ACM, New York, NY, USA, 43-54.
[2] Matthias Müller, Jos Stam, Doug James, and Nils Thürey. 2008. Real time physics: class notes. In ACM SIGGRAPH 2008 classes (SIGGRAPH '08). ACM, New York, NY, USA, , Article 88 , 90 pages.
附錄
標量函數對向量的導數:
,其中:x∈Rn。
向量函數對向量的導數(雅克比矩陣):
,其中:f: Rn→Rm,x∈Rn。
向量模對向量的導數:
,其中:
。
單位向量對向量的導數:
利用上述公式可以推導出隱式歐拉積分中Jacobian矩陣中子矩陣的表達式:
參考:
http://blog.mmacklin.com/2012/05/04/implicitsprings
本文為原創,轉載請注明出處:http://www.cnblogs.com/shushen。