唐 勇,趙 偉,宛月茶,趙 靜,吳德陽
1(燕山大學 信息科學與工程學院,河北 秦皇島 066004)2(河北省計算機虛擬技術與系統(tǒng)集成重點實驗室,河北 秦皇島 066004)
布料與流體的運動過程在物理上具有不同的特征,各自遵循著其物理規(guī)律,交互時,它們的相互作用更是增加了彼此運動的復雜性,其中比較常見的問題就是流體與布料和布料自身的穿透,利用深度學習改進布料精度較低的問題,使布料自身的準確度大幅度提高[1],但在一些應用程序中,布料與流體的交互不僅強調(diào)的是準確性,更要求達到實時.所以要滿足上述需求,就必須對傳統(tǒng)的碰撞檢測方法進行修改或提高計算效率.
對布料與流體交互的運動學進行研究,其中碰撞問題占了很大一部分,它分為布料與流體之間的碰撞和布料的自碰撞.對于基于粒子的流體,通常將可變形體也轉(zhuǎn)化為粒子來實現(xiàn)與流體的耦合.2004年Müller等[2]使用SPH方法模擬流體,并將虛擬邊界粒子放置在可變形物體的表面,通過Lennard-Jones勢能來模擬排斥力和黏附力,但是這種方法需要很小的時間步長來確保流體粒子不會穿過固體;Akinci等[3]擴展了流體與可變形體的耦合方法,引入了自適應邊界采樣,以避免變形時網(wǎng)格的過采樣和欠采樣,并解決了時間步長小的問題;Harada等[4]通過計算由粒子構成的流體和由多邊形構成的布料之間的距離來解決碰撞問題,此距離是通過找到粒子所屬體素最近的布料多邊形之間的近似距離,但是當布料流體形變較復雜時,會導致流體粒子在表面的堆積;Yang等[5]為生成的虛擬粒子屬性動態(tài)地分配內(nèi)存,克服了粒子的堆積問題,此外,生成的粒子的屬性最終恢復到基于網(wǎng)格的模型狀態(tài),然而,該方法嚴重依賴于用于處理相互作用的附加粒子,需要更多的存儲器,并且對于額外的粒子處理而言是耗時的,無法達到實時狀態(tài);2012年Du等[6]提出基于布料厚度的膨脹式連續(xù)碰撞檢測方法,用于檢測基于SPH的流體粒子與布料之間的碰撞,通過Lennard-Jones勢來描述兩個粒子之間的相互作用,實現(xiàn)布料與流體粒子的碰撞檢測;2015年孟云等[7]通過為每個流體粒子建立粒子/網(wǎng)格索引表和鄰接表,在仿真過程中通過計算發(fā)生碰撞粒子的周圍粒子對該粒子的作用力,并對作用力進行累加得到碰撞時的接觸力,最后將算法過程流映射到GPU上,提高了算法的準確度和效率;2018年臧惠等[8]改進布料的重復采樣問題提高布料流體間的碰撞檢測速度,通過計算流體粒子與采樣粒子之間的作用力來更新布料與流體的位置,但這些方法都未考慮布料的自碰撞問題.
針對以上問題,本文提出一種用于實時模擬布料與流體交互的方法來解決流體穿透布料和布料自碰撞的問題.首先,結(jié)合質(zhì)點彈簧模型與基于位置的動力學方法對布料進行建模,其次,通過膨脹式連續(xù)碰撞檢測方法檢測布料與流體之間的碰撞,使用基于懲罰的接觸力處理布料流體之間的碰撞響應,并引入交互因子記錄布料與流體的首次接觸時間,采用基于k-DOPs的層次包圍體[9]對布料自碰撞進行檢測,最后,根據(jù)對約束動力學和碰撞力的數(shù)值計算,對布料和流體的位置和速度進行更新.
結(jié)合質(zhì)點彈簧模型與基于位置的約束方法對布料進行建模,取消質(zhì)點之間彈簧的拉伸和彎曲的彈性力,只進行約束作用,可以更快速穩(wěn)定地模擬布料受力之后的變形以及發(fā)生穿透后的處理,提高布料自碰撞響應的效率.
質(zhì)點之間取消結(jié)構彈簧的作用力,引入距離約束來建模拉伸力,它只與質(zhì)點間的位置有關,保證了布料上的三角形結(jié)構不會被過度拉伸;對于布料上每一對相鄰三角形,取消質(zhì)點間彎曲彈簧的彈力作用,引入彎曲后的角度為彎曲約束,它們被分別定義為:
Cstrech(x1,x2)=|x1-x2|-l0
(1)
Cbend(x1,x2,x3,x4)=arccos(n1·n2)-φ0
(2)
其中,方程(1)中x1和x2為質(zhì)點的位置,l0為質(zhì)點之間的初始距離;方程(2)中兩個相鄰三角形彎曲后的夾角實際上是這兩個三角形法線的夾角,如圖1所示,設相鄰的兩個三角形為T1(x1,x2,x3)和T2(x1,x2,x4),n1和n2分別為T1和T2的法向量,φ0為兩個三角形夾角的初始值,方程(1)和方程(2)類型均為等式約束.
圖1 彎曲后的二面角Fig.1 Dihedral angle after bending
本文使用光滑粒子流體力學(SPH)[10,11]模擬流體,SPH的粒子包含著所有物理量的信息,具體某處粒子的物理屬性是由周圍粒子的函數(shù)值進行插值得到,位置r處的物理屬性為:
(3)
其中,mj是相鄰粒子的質(zhì)量,ρj是密度,W是光滑核函數(shù),h是光滑核半徑,rj表示的是核半徑h范圍內(nèi)的所有流體粒子,fi(r)為累加后的粒子的物理屬性.通過計算流體粒子的密度ρj、壓力Ρi和黏度νi,并與外力fi一起代入到納斯-斯托克斯方程中,通過牛頓第二定律求解得到流體粒子的加速度:
(4)
傳統(tǒng)的布料與流體交互模擬的實驗中并沒有考慮布料自碰撞檢測,極易產(chǎn)生穿透.為避免這種現(xiàn)象,本文引入基于k-DOPs的層次包圍體對布料進行自碰撞檢測.
布料是由三角形網(wǎng)格組成,所以對布料的自碰撞檢測就是對三角形-三角形之間進行相交檢測[12].采用擴張的k-DOPs包圍體層次結(jié)構來檢測布料自碰撞,布料被構造成一棵二叉樹,并將每一個上層節(jié)點拆分成左、右包圍體子樹,從而檢測左、右包圍體子樹的碰撞.
自碰撞響應對于已經(jīng)檢測到的自碰撞,應給予正確的碰撞響應,避免布料自身發(fā)生穿透.對于自碰撞響應也是通過增加約束的方法來控制質(zhì)點的運動,此約束為:
Cself(p,x1,x2,x3)=(p-x1)·n-h
(5)
圖2為布料與流體交互后出現(xiàn)的自碰撞效果,其中圖2(a)為懸掛的布料在受到流體的作用力后發(fā)生自碰撞后產(chǎn)生穿透;圖2(b)為引入自碰撞檢測后穿透問題解決的效果.
圖2 布料自碰撞Fig.2 Cloth self-collision
傳統(tǒng)的連續(xù)碰撞檢測方法只能檢測碰撞發(fā)生在某一幀內(nèi),并且檢測的準確精度有限,無法確定接觸發(fā)生的具體時刻,如圖3所示.本文通過引入交互因子λt來記錄發(fā)生接觸的最早時刻,解決連續(xù)碰撞檢測時間準確度要求高的問題,并在發(fā)生接觸時調(diào)用布料自碰撞模塊,交互因子λt的計算是利用接觸時點與三角形共面的特性來計算的,流體粒子p和三角形T(x1,x2,x3)共面的計算方式如下所示:
(6)
進一步求出:
(px1+λtν1)×(px2+λtν2)·(px3+λtν3)=0
(7)
求出λt,對接觸的4個點進行近似性測試,若它們的距離足夠小并且小于布料厚度h,則說明檢測到接觸,此時即可調(diào)用布料自碰撞檢測模塊,進行k-DOPs包圍體層次結(jié)構的自碰撞檢測.若出現(xiàn)多個λt,則取λt的最小值作為接觸發(fā)生的時刻.
(a) (b)
基于懲罰的接觸力
考慮布料厚度后可以根據(jù)流體粒子的穿透深度更準確地估計碰撞后的接觸力,通過上述方法計算出的碰撞點和碰撞時間,可得到對于任何在兩位置之間相互穿透并沿連續(xù)路徑移動的特征對,基于懲罰的接觸力應該由法向量的方向和碰撞點的相對速度決定.
本文接觸力的計算是根據(jù)文獻[7]引入的接觸力定理得到的:
(8)
其中Q為流體粒子p在布料上的碰撞點,nc為在碰撞時刻t的三角形法向量,k為剛度常量,δt為碰撞的時間間隔,得出接觸力后重新計算布料的運動,防止出現(xiàn)穿透現(xiàn)象.
為驗證本文方法的有效性,在硬件系統(tǒng)為Intel i7-4790 的CPU和顯卡為 NVIDIA GeForce GTX 750 Ti上進行仿真實驗,使用Unity物理引擎并結(jié)合c#語言,開發(fā)完成了布料與流體交互的實驗.
圖4 文獻[4]與本文方法對比Fig.4 Different collision methods′s simulation
圖4分別展示了文獻[4]和本文方法模擬的不同量的流體流向布料的效果,兩種方法的流體粒子數(shù)量分別為45k和65k,由于文獻[4]中需要計算粒子與布料之間的距離,計算代價高,平均速率為19fps,而本文采用質(zhì)點彈簧與基于位置的方法結(jié)合對布料建模,加快了碰撞檢測速度,平均幀速為37fps,達到了布料流體交互場景的實時模擬要求.
圖5展示了文獻[8]和本文方法中把布料4個角固定住后,流體粒子灑向布料的效果,但文獻[8]未考慮布料自碰撞.本文在流體與布料碰撞檢測的基礎上引入布料自碰撞檢測,圖5(c)為固定3個角時布料與流體的交互,解決了布料與流體粒子和布料自身的穿透問題,模擬效果更加真實.
圖5 文獻[8]方法與本文方法對比Fig.5 Different collision methods′s simulation
圖6展示了文獻[6]和本文方法中流體流向兩塊布料的效果.本文方法在文獻[6]的基礎上進行改進,確定碰撞的具體時刻,使檢測更加精確,且模擬時速率為32fps.從視覺上可以看出,本文的方法在解決流體穿透布料的同時還能更好地模擬布料的褶皺現(xiàn)象,真實的展示布料的物理特性.
圖6 文獻[6]方法與本文方法對比Fig.6 Different methods of simulation
本文在布料與流體交互過程中增加了布料撕裂現(xiàn)象的模擬.對裝滿流體粒子的布料球進行撕裂,流體粒子會發(fā)生溢出,由于布料與流體的雙向耦合,溢出的流體粒子會迫使布料向后運動,并產(chǎn)生自碰撞的效果.其中圖7(a)展示的是流體粒子的效果,圖7(b)是對粒子進行渲染后的效果.
圖7 通過撕裂布料球來釋放流體Fig.7 Cloth tearing and releasing fluid
表1描述了本文方法的性能和與文獻的數(shù)據(jù)對比,通過表格數(shù)據(jù)可以看出,在粒子數(shù)和布料分辨率相近的情況下,本文方法速率高,具有明顯的實時性.本文方法不僅可以模擬布料與流體的交互,還在實驗中考慮了布料撕裂和自碰撞的現(xiàn)象,使模擬效果更加真實,仿真效率更高.
表1 實驗場景的總體性能表Table 1 Experimental scene performance
本文在膨脹式連續(xù)碰撞檢測方法的基礎上引入交互因子檢測布料流體的碰撞時間,解決了連續(xù)碰撞檢測方法不能準確確定碰撞時刻的問題;并采用基于k-DOPs的包圍體層次結(jié)構對布料進行自碰撞檢測,避免了布料自碰撞時發(fā)生穿透;通過取消布料質(zhì)點間彈簧的內(nèi)力,引入拉伸和彎曲約束來控制質(zhì)點的位移和速度,加快了處理布料流體之間和布料自身的碰撞響應速度,從而保證了實時性.今后會繼續(xù)將本文的方法放到GPU上進行并行加速計算,進一步提高仿真速率,并改進對流體的渲染.