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