1. 程式人生 > >【計算機圖形】Physics-Based Animation-小8君的專欄

【計算機圖形】Physics-Based Animation-小8君的專欄

使用粒子法模擬水流時,水流表面的生成主要分成如下兩部分。

表面隱函式

  • Muller的色彩函式 [1]
  • Zhu and Bridson的方法 [2]
  • Adams等的方法 [3]
  • Anisotropic Kernel [4]
  • Upsampling法 [5]

生成網格(Mesh)

  • Marching Cubes(MC) [6]
  • Regularised marching tetrahedra(RMT) [7]
  • Screen Space Mesh [8], [9]
本篇先介紹 表面隱函式 中的Anisotropic kernel法。

各向異性核心函式(Anisotropic kernel)

從粒子中生成隱函式的時候,使用下式這樣的平滑化核心函式。

anisotropic_kernel.eq1.gif

其中,anisotropic_kernel.eq2.gif是換算係數,anisotropic_kernel.eq3.gif是模擬的次元數, anisotropic_kernel.eq4.gif是local support(距離變遠時值平滑減小)的對稱函式。 這個定義類似於所謂的元球技術(Metaball), 生成的表面呈凹凸不平狀(下圖左)。像這樣的表面我們稱為blobby面。

為了改進blobby的表面形狀,Yu等人[10] 匯入了各向異性核心(anisotropic kernel)來取代之前的各向同性核心。 也就是,使用正定矩陣anisotropic_kernel.eq6.gif來代替anisotropic_kernel.eq5.gif

anisotropic_kernel.eq7.gif

此時,矩陣anisotropic_kernel.eq8.gif中包含了旋轉和伸縮變換,並且使用橢圓來取代球形狀。通過把法線方向設定成橢圓短軸所在的方向,可以得到下圖右側這樣平滑且邊緣清晰的表面。另外,為了消除靠近表面粒子的不規則分佈,也將粒子位置的關聯函式進行平滑化處理,計算更新後位置anisotropic_kernel.eq9.gif

。對於全部的流體粒子,通過計算anisotropic_kernel.eq10.gifanisotropic_kernel.eq11.gif我們可以得到下式這樣的隱函式場。

anisotropic_kernel.eq12.gif
anisotropic_kernel.jpg
(左) 各向同性核心,(右)各向異性核心的表面

下面我們對參考文獻[10]的anisotropic_kernel.eq10.gifanisotropic_kernel.eq11.gif的計算方法進行詳細說明。

粒子位置的更新

為了修正不規則的粒子的位置,使用下面的Laplacian平滑處理來更新粒子的中心座標。

anisotropic_kernel.eq13.gif

anisotropic_kernel.eq14.gif是常數項,[10]中推薦使用0.9~1之間的值。這裡的 anisotropic_kernel.eq15.gif是加權函式,計算如下

anisotropic_kernel.eq16.gif

這裡的加權函式通過計算協方差矩陣來計算各向異性。 為了能較為準確的計算各向異性,需要包含較多的流體粒子,因此上式中的有效半徑anisotropic_kernel.eq5.gif設定為流體模擬用的有效半徑的2倍大小。

另外,這裡的anisotropic_kernel.eq9.gif僅用於表面的生成,而非流體模擬處理。 因此,更新前的位置anisotropic_kernel.eq17.gif

會儲存在其他變數裡。

協方差矩陣的計算

為了得到anisotropic_kernel.eq6.gif,這裡使用加權主成分分析法(WPCA:Weighted Principal Component Analysis)[11]進行計算。 主成分分析(PCA)是一種常用於影象識別領域的資料解析手法,可以根據分散資料的特徵值生成新的座標軸(主軸)以減少資料量。WPCA是在PCA中增加了各個資料的加權,可以更好的處理異常點(outlier)或噪音。

在WPCA法中,我們首先計算各資料點的權重,然後根據權重求出其協方差矩陣(covariance matrix)anisotropic_kernel.eq18.gif, 最後,對anisotropic_kernel.eq18.gif進行特徵值分析求得特徵值,並把具有較大特徵值所在的特徵向量設定為新的主軸。最後,從WPCA所得結果中計算anisotropic_kernel.eq6.gif

首先,計算加權後的平均位置anisotropic_kernel.eq19.gif

anisotropic_kernel.eq20.gif

anisotropic_kernel.eq19.gif指粒子anisotropic_kernel.eq21.gif的臨近粒子的中心。 通過使用權重anisotropic_kernel.eq15.gif,可以極大的減少距離anisotropic_kernel.eq22.gif很遠的異常點的影響。

通過從anisotropic_kernel.eq19.gif到周圍的各臨近粒子的位置anisotropic_kernel.eq23.gif的向量的積,計算協方差矩陣。

anisotropic_kernel.eq24.gif

這裡使用的加權函式anisotropic_kernel.eq15.gif與粒子位置更新時所使用的相同。

協方差矩陣特徵值分解

為了得到橢圓的伸縮方向,我們將協方差矩陣anisotropic_kernel.eq18.gif進行特徵值分解,計算特徵值和特徵向量。

anisotropic_kernel.eq25.gif

anisotropic_kernel.eq26.gif是各列特徵向量的旋轉矩陣,anisotropic_kernel.eq27.gif是對角矩陣。為了應對大幅度變形或者臨近粒子很少的孤立粒子等情況,我們進行如下處理來修正anisotropic_kernel.eq27.gif

  • 檢查特徵值防止大幅度變形發生。先把特徵值從大到小排列, 當出現滿足anisotropic_kernel.eq28.gifanisotropic_kernel.eq29.gif時,使用anisotropic_kernel.eq30.gif替換(anisotropic_kernel.eq31.gif)。
  • 檢查臨近粒子數,找出孤立粒子。如果臨近粒子數比anisotropic_kernel.eq32.gif小時,讓anisotropic_kernel.eq33.gif。這裡的anisotropic_kernel.eq34.gif是單位矩陣,anisotropic_kernel.eq35.gif是控制核心大小的引數。
  • 臨近粒子全在的情況下,為了保持體積一定, 匯入滿足anisotropic_kernel.eq36.gifanisotropic_kernel.eq37.gif。 此時,修正後的協方差矩陣anisotropic_kernel.eq38.gif如下所示。 anisotropic_kernel.eq39.gif
anisotropic_kernel.eq40.gif

這裡的anisotropic_kernel.eq41.gif。參考文獻[11]中,使用的anisotropic_kernel.eq42.gif

計算G

anisotropic_kernel.eq6.gifanisotropic_kernel.eq38.gif的逆矩陣乘以anisotropic_kernel.eq43.gif後的結果。

anisotropic_kernel.eq44.gif

結果圖

這裡使用和【CG物理模擬系列】流體模擬--粒子法之SPH(實現)中類似場景,粒子數約25,000,網格化(MC法)的網格解析度是256x103x103。

首先,應用協方差矩陣,把粒子當作橢圓體的繪圖結果如下。

dam_break1_ap.jpg dam_break1_np.jpg
左是各向異性核心,右是各向同性核心的結果

去掉網格面,使用GLSL繪製的折射面結果如下。

dam_break1_ar.jpg dam_break1_nr.jpg
左是各向異性核心,右是各向同性核心的結果

使用各向異性核心後的表面,不僅表面變得更加圓滑,也很好的再現了黏附在兩側牆壁上的薄層水膜。具體如下所示。

dam_break2_ap.jpg dam_break2_np.jpg
左是各向異性核心,右是各向同性核心的結果

放大後如下。

dam_break3_ap.jpg dam_break3_np.jpg
左是各向異性核心,右是各向同性核心的結果

去掉網格面,使用GLSL繪製的折射面結果如下。

dam_break2_ar.jpg dam_break2_nr.jpg
左是各向異性核心,右是各向同性核心的結果

大致計算時間,SPH計算:5ms/frame,各向異性核心中G的計算:10ms/frame,應用各向異性後網格化耗時:145ms/frame(以前的各向同性核心是15ms/frame)。這裡的SPH的計算,各向異性核心的計算,和MC法網格化都是在GeForceGTX580顯示卡上,使用CUDA在GPU上測試得出的結果。

直接繪製粒子時,各向同性核心使用了Point Sprite,而各向異性核心則使用glutSolidSphere繪製橢圓。因此,繪製時間較久(我的環境下各向同性核心耗時85ms/frame,Point Sprite各向同性核心15ms/frame)。

參考文獻

[1]M. Muller, D. Charypar and M. Gross, Particle-based Fluid Simulation for Interactive Applications, Proc. SCA2003, pp.154-159, 2003.

[2]Y. Zhu and R. Bridson, Animating sand as a fluid, Proc. SIGGRAPH 2005, pp.965-971, 2005.

[3] B. Adams, M. Pauly, R. Keiser and L. J. Guibas, Adaptively sampled particle fluids, Proc. SIGGRAPH2007, 48, 2007. 

[4]  J. Yu and G. Turk, Reconstructing Surfaces of Particle-Based Fluids Using Anisotropic Kernels, In Proceedings of the 2010 ACM SIGGRAPH/Eurographics symposium on Computer animation, 2010. 

[5] B. Solenthaler, Y. Zhang and R. Pajarola, Efficient Refinement of Dynamic Point Data, Proc. Eurographics/IEEE VGTC Symposium on Point-Based Graphics, 2007. 

[6] W. E. Lorensen and H. E. Cline, Marching cubes: a high resolution 3D surface construction algorithm, Computer Graphics (Proc. SIGGRAPH '87), 21, 163-169, 1987.

[7] G. M. Treece, R. W. Prager and A. H. Gee, Regularised marching tetrahedra: improved isosurface extraction, Computers and Graphics, 23, pp.583-598, 1999. 

[8] M. Muller, S. Schirm and S. Duthaler, Screen space meshes, Proc. SCA2007, pp.9-15, 2007. 

[9] W. J. van der Laan, S. Green and M. Sainz, Screen space fluid rendering with curvature flow, Proc. 2009 symposium on Interactive 3D graphics and games, pp.91-98, 2009. 

[10] J. Yu and G. Turk, Reconstructing Surfaces of Particle-Based Fluids Using Anisotropic Kernels, In Proceedings of the 2010 ACM SIGGRAPH/Eurographics symposium on Computer animation, 2010.

[11] Y. Koren and L. Carmel, Visualization of labeled data using linear transformations, In Proceedings of IEEE Information Visualization, 2003.