胡中天,
(浙江科技學(xué)院 信息與電子工程學(xué)院,杭州 310023)
三維場景的真實(shí)感與實(shí)時繪制一直是相關(guān)研究領(lǐng)域的熱點(diǎn)問題。在實(shí)際應(yīng)用中為增強(qiáng)雨天的真實(shí)感,通常在場景中加入實(shí)時模擬的降雨效果?,F(xiàn)有方法多采用基于粒子系統(tǒng)[1-2]或圖像后處理[3]的模擬方法,這些方法能夠較好地模擬雨點(diǎn)的真實(shí)物理運(yùn)動,但模擬出的雨滴無法與場景中的物體產(chǎn)生真實(shí)的交互。為解決流體與物體的交互問題,提出了各種流體模擬方法,現(xiàn)有方法主要有3種:基于歐拉的網(wǎng)格法[4],基于拉格朗日的粒子法[5]以及混合法[6],這些方法本質(zhì)上都基于納維-斯托克斯方程。但由于忽略了水滴對物體表面的黏附力、水滴自身的表面張力等因素,導(dǎo)致了這些方法更適用于大規(guī)模水體模擬。同時,隨著當(dāng)下三維模型精度的提高,無論采用以上哪種方法進(jìn)行三維物體表面水滴運(yùn)動的模擬都需要遍歷大量模型頂點(diǎn)數(shù)據(jù),開銷較大。因此,仍需深入研究如何精確高效地實(shí)現(xiàn)水滴規(guī)模的流體模擬。
文獻(xiàn)[7]提出一種玻璃板上基于格點(diǎn)的水滴運(yùn)動啟發(fā)式模擬方法,物理仿真時考慮了水滴的黏附力與表面張力,得到了較真實(shí)的模擬結(jié)果。文獻(xiàn)[8]在仿真計(jì)算中還引入了接觸角模型以模擬水滴在斜面上的運(yùn)動狀態(tài)。但以上方法只適用于平面上的水滴運(yùn)動。
文獻(xiàn)[9]基于顯示曲面法模擬了水滴的固液交互現(xiàn)象。文獻(xiàn)[10]通過為淚滴運(yùn)動尾跡建立獨(dú)立三維網(wǎng)格的形式模擬了流淚動畫。這2種方法都實(shí)現(xiàn)了液滴與任意形狀物體表面的交互,但計(jì)算過程繁瑣。文獻(xiàn)[11]在光滑粒子動力學(xué)(Smoothed Particle Hydrodynamics,SPH)模型中引入表面張力項(xiàng)與黏性項(xiàng),克服了SPH等流體模型不能直接應(yīng)用于水滴運(yùn)動模擬的問題。文獻(xiàn)[12]也使用類似方法模擬了虛擬人流淚與流汗情境,但模擬效率不高。文獻(xiàn)[13]提出一種基于SPH的流淚動畫降維模擬方法,采用切空間變換將物理仿真變換到二維空間,徹底避免了三維空間下的點(diǎn)-面碰撞開銷問題。但該文對于離開二維仿真空間的淚滴只是簡單地作刪除處理,導(dǎo)致了模擬依賴于連續(xù)的曲面。
綜合以上分析,已有模擬方法可分為2類:三維模擬方法與降維模擬方法。前者在三維空間下模擬水滴運(yùn)動,使用三維網(wǎng)格渲染水滴,通常存在因計(jì)算開銷較大而導(dǎo)致模擬效率不高的問題;后者則在二維空間內(nèi)模擬水滴運(yùn)動,使用法線貼圖渲染水滴,效率較高但存在水滴無法離開紋理空間的局限性問題。為解決以上方法中存在的問題,本文提出一種三維與二維混合的物體表面水滴運(yùn)動模擬方法,基于坐標(biāo)空間變換實(shí)現(xiàn)2種水滴類型的轉(zhuǎn)換,轉(zhuǎn)換后的水滴繼承之前水滴的位置、質(zhì)量與速度。三維水滴采用三維網(wǎng)格渲染,紋理空間內(nèi)的二維水滴采用法線貼圖渲染。
已有降維模擬方法均假設(shè)水滴不會從紋理空間滴落到三維空間,水滴直接在紋理空間內(nèi)產(chǎn)生也消失于紋理空間。例如文獻(xiàn)[13]的仿真模型中雖然討論了切空間下水滴所受壓力場為負(fù)值導(dǎo)致水滴離開紋理空間的情況,但沒有進(jìn)一步討論這種情況下水滴的運(yùn)動而是直接將其從仿真集合中刪除。為解決這種局限性問題,本文在進(jìn)行仿真計(jì)算時將水滴分為2種類型:三維水滴與二維水滴,這2種水滴類型能夠互相轉(zhuǎn)換并繼承物理屬性。三維水滴與物體表面發(fā)生碰撞時,轉(zhuǎn)換為二維水滴;二維水滴在達(dá)到臨界條件后,轉(zhuǎn)換為三維水滴,轉(zhuǎn)換過程如圖1所示。
圖1 水滴轉(zhuǎn)換過程
而對于水滴之間融合、分離等細(xì)節(jié)現(xiàn)象的模擬,相對于顯示曲面方法[9]以及SPH方法[11-13]在水滴數(shù)量增多時模擬效率下降明顯的情況,本文方法先將紋理空間內(nèi)的水滴粒子作為剛體進(jìn)行物理仿真,再通過對紋理圖像的處理獲得細(xì)節(jié)效果,以獲得更快且更穩(wěn)定的模擬效率。紋理空間內(nèi)二維水滴的處理流程如圖2所示。
圖2 二維紋理空間水滴仿真流程
為實(shí)現(xiàn)水滴類型的轉(zhuǎn)換,首先要實(shí)現(xiàn)世界空間坐標(biāo)到對應(yīng)紋理空間坐標(biāo)的轉(zhuǎn)換。模型表面的局部空間坐標(biāo)經(jīng)過旋轉(zhuǎn)、平移、縮放后得到其所在的世界坐標(biāo)。首先求解旋轉(zhuǎn)變換矩陣,模型分別繞Z軸、X軸以及Y軸旋轉(zhuǎn)角的變換矩陣為:
(1)
令D=A·B·C,D即為旋轉(zhuǎn)變換矩陣。
模型沿X、Y、Z坐標(biāo)軸分別平移Tx、Ty、Tz距離的平移變換矩陣為:
E=[TxTyTz]
(2)
模型沿X、Y、Z坐標(biāo)軸分別縮放Sx、Sy、Sz倍的縮放變換矩陣為:
故對世界空間中水滴與曲面發(fā)生碰撞的一點(diǎn)(x,y,z),可得局部空間下的碰撞點(diǎn)(x′,y′,z′):
[x′y′z′]=[xyz]·D-1·F-1-E
(4)
通過(x′,y′,z′)即可查詢到對應(yīng)的UV坐標(biāo)點(diǎn)(u,v),至此即完成了世界空間下的物體表面坐標(biāo)到對應(yīng)紋理空間坐標(biāo)的轉(zhuǎn)換。
為了對紋理空間內(nèi)水滴的物理仿真進(jìn)行降維處理,世界空間下的外力需要進(jìn)行切空間變換。局部空間下的力由沿局部坐標(biāo)系3個坐標(biāo)軸方向的分量Fx、Fy、Fz組成,從世界空間到局部空間的變換矩陣為:
紋理空間由三角形面片劃分,對應(yīng)模型曲面的每個三角形面片的切向T、B分量,于是可得其法向量:
N=T×B
(6)
從紋理空間到局部空間的變換矩陣為:
得到以上變換矩陣后,將世界空間下的重力G與風(fēng)力Fw變換到紋理空間:
紋理空間下的重力與風(fēng)力場即為FWG(u,v)=(Fu,Fv),壓力場即為FN(u,v)=Fn。
完成水滴坐標(biāo)的轉(zhuǎn)換后,還需要對水滴的速度與受力進(jìn)行轉(zhuǎn)換。三維水滴在世界空間受到重力、風(fēng)力、空氣阻力、空氣浮力等作用運(yùn)動,在轉(zhuǎn)換到紋理空間后,二維水滴受到紋理空間下的重力、風(fēng)力、壓力、水滴與物體表面間的摩擦力、吸附力以及水滴自身表面張力影響;對于初速度,三維水滴進(jìn)入紋理空間后,由變換矩陣得到其在紋理空間下的3個速度分量:
于是轉(zhuǎn)換得到的二維水滴的初速度即為:
Vuv(0)=Vu+Vv
(10)
而對于進(jìn)入世界空間的二維水滴,轉(zhuǎn)換時還需要計(jì)算其法向速度分量,即轉(zhuǎn)換得到的三維水滴的初速度為:
(11)
本文的水滴運(yùn)動物理仿真主要發(fā)生在物體表面即紋理空間,物理計(jì)算過程可以描述為:對于給定大小的二維紋理空間,給定水滴的初始位置向量X(0)、初速度V(0)、自身質(zhì)量m、對物體表面的吸附力Fadhension、表面張力Ftension、靜摩擦力Fs、動摩擦系數(shù)μ、重力加速度g,重力與風(fēng)力場FWG(u,v)、定義時間步為dt,求解二維立面上水滴的運(yùn)動軌跡方程。其中,X(0)由三維水滴與物體的碰撞點(diǎn)確定,X(0)為碰撞瞬間水滴速度在物體表面的切向分量。
圖3為一顆二維立面上的水滴,FN為切空間法向方向的力,即水滴受到的壓力,Ff為摩擦力,Fu與Fv為重力與風(fēng)力在切空間切向的2個分力。
圖3 水滴粒子受力圖
壓力FN方向上水滴受到水滴與表面間的吸附力與自身表面張力以及壓力場影響,有:
FN=Fadhension+Ftension+Fn
(12)
其中,Ftension=k/|ρ|表示水滴與曲面之間由于彎曲趨勢產(chǎn)生的表面張力。于是可得到水滴受到的滑動摩擦力大小為:
|Ff|=μ|FN|
(13)
FTB(t)=Fu+Fv+Ff
(14)
由式(5)可得水滴此時的切向加速度a(t)為:
當(dāng)水滴粒子達(dá)到臨界狀態(tài)時,水滴即離開紋理空間進(jìn)入三維空間,臨界狀態(tài)包括2種:1)水滴粒子在紋理空間運(yùn)動時超出了限定的UV坐標(biāo)范圍;2)水滴粒子受到的壓力FN為負(fù)值。
水滴運(yùn)動軌跡方程采用velocity-verlet積分算法計(jì)算,速度表達(dá)式為:
位置表達(dá)式為:
將式(5)、式(6)代入式(7)、式(8),得t+dt時刻下的水滴速度與位置表達(dá)式為:
繪制高度圖時,任意水滴的中心點(diǎn)灰度值為:
(21)
然后將高度圖轉(zhuǎn)換為法線紋理,對于紋理空間內(nèi)任一像素點(diǎn),其RGBA值為(Δx,Δy,1,1)。其中:
lgrayScale、rgrayScale、ugrayScale、dgrayScale分別為該像素點(diǎn)左右上下的像素灰度值。水滴的反射與折射效果通過抓取屏幕背景截圖并基于法線貼圖對其UV進(jìn)行扭曲、偏移的方式渲染。
實(shí)驗(yàn)在Unity 3D引擎中進(jìn)行,系統(tǒng)運(yùn)行在一臺Intel Core i5-4210U CPU @ 1.70 GHz四核CPU,NVIDIA GeForce 820M顯卡的計(jì)算機(jī)上,Unity 3D版本為5.3.4f1(64 bit),實(shí)驗(yàn)中計(jì)算的二維水滴紋理分辨率為1 600像素×900像素大小。
實(shí)驗(yàn)分為2個部分,第1部分負(fù)責(zé)三維水滴的物理仿真與渲染,第2部分負(fù)責(zé)二維水滴的物理仿真與渲染。
第1部分的大致處理流程如圖8所示。預(yù)處理階段產(chǎn)生質(zhì)量大小不同的三維水滴,實(shí)驗(yàn)中采用的三維水滴網(wǎng)格為方形面片。三維水滴通過物理仿真下落到物體表面,在碰撞點(diǎn)處轉(zhuǎn)換為紋理空間的二維水滴。
圖8 第1部分處理流程
第2部分的大致處理流程如圖9所示。二維水滴繼承三維水滴的質(zhì)量大小與速度,預(yù)處理階段完成數(shù)據(jù)的轉(zhuǎn)換,之后水滴在紋理空間內(nèi)繼續(xù)進(jìn)行物理仿真,達(dá)到臨界條件后從物體表面紋理空間離開,再次轉(zhuǎn)換為三維水滴。
圖9 第2部分處理流程
圖10所示為水滴在非連續(xù)曲面上運(yùn)動的模擬結(jié)果,場景中僅包括重力,三維水滴在滴落過程中經(jīng)過2個不連續(xù)的平面,經(jīng)歷4次轉(zhuǎn)換。圖11所示為2個平面的紋理圖像模擬結(jié)果,顯示了水滴在2個平面上的運(yùn)動留下的尾跡。
圖10 非連續(xù)曲面的滴落
圖11 2個平面的紋理貼圖模擬結(jié)果
如圖12所示為本文方法實(shí)現(xiàn)的模擬結(jié)果與實(shí)拍照片的對比。
圖12 各種情況下的雨滴運(yùn)動模擬
圖13所示為實(shí)拍照片及不同方法在球體表面的水滴運(yùn)動模擬結(jié)果對比。
圖13 球體表面水滴運(yùn)動模擬結(jié)果
普通三維SPH方法因?yàn)槟M中未加入黏性項(xiàng)與表面張力項(xiàng),水滴粒子與球體表面發(fā)生碰撞后無法沿曲面滑下,產(chǎn)生了錯誤的模擬結(jié)果,而加入了黏性項(xiàng)與表面張力項(xiàng)的改進(jìn)三維SPH方法則能夠得到正確的模擬結(jié)果。降維SPH模擬方法中水滴被繪制在法線紋理上,以貼圖方式渲染,水滴能夠沿著曲面滑落但不能離開紋理空間。在本文方法的模擬結(jié)果中,水滴粒子分為2種類型,在紋理空間外水滴粒子以三維網(wǎng)格渲染,而處于物體表面紋理空間內(nèi)的水滴粒子則以法線貼圖方式渲染,水滴能夠產(chǎn)生正確的運(yùn)動軌跡且能夠離開紋理空間。
圖14-圖16所示為不同風(fēng)力環(huán)境下不同方法的虛擬人流淚模擬結(jié)果對比。
圖14 風(fēng)力(0.0,0.0,0.0)的模擬結(jié)果對比
圖15 風(fēng)力(10.0,0.0,0.0)的模擬結(jié)果對比
圖16 風(fēng)力(0.0,0.0,5.0)的模擬結(jié)果對比
圖17為各方法模擬水滴融合產(chǎn)生液體橋現(xiàn)象的結(jié)果。基于顯示曲面的模擬方法中,2個水滴只是簡單疊加,而基于SPH的方法與本文基于圖像處理算法的方法則在水滴間產(chǎn)生了良好的融合效果。
圖17 液體橋模擬結(jié)果對比
圖18所示為降維SPH與本文方法模擬的流經(jīng)物體表面水滴留下的尾跡,圖18(a)為降維SPH模擬結(jié)果,圖18(b)~圖18(e)為本文方法模擬結(jié)果,從左至右尾跡的插值細(xì)分值分別為0、1、2、3。本文方法能夠更靈活地獲得需要的尾跡效果。
圖18 尾跡模擬結(jié)果對比
表1為三維SPH、降維SPH以及本文方法在不同粒子數(shù)情況下的模擬效率對比,模擬系統(tǒng)中使用的模型三角面片數(shù)超過10 000個。表2為不同方法在不同三角面片數(shù)模型表面模擬的效率對比,模擬系統(tǒng)中最大粒子數(shù)為5 000個。在同等條件下,本文方法的模擬效率相比基于SPH的二維與三維模擬方法分別提高了2倍與5倍以上。
表1 各方法在不同粒子數(shù)下模擬的平均幀速率 frame/s
表2 各方法在不同面數(shù)模型表面模擬的平均幀速率 frame/s
在現(xiàn)有方法中,三維空間下的模擬方法往往存在計(jì)算開銷大、效率低的問題,而降維模擬方法又存在水滴只能在紋理空間內(nèi)模擬的局限性問題。本文結(jié)合了三維與二維模擬方法的特點(diǎn),提出了一種實(shí)時水滴運(yùn)動仿真方法。該方法效率更高,且水滴粒子能夠在世界空間與紋理空間之間進(jìn)行轉(zhuǎn)換。
本文提出了一種能夠?qū)ξ矬w表面的水滴運(yùn)動進(jìn)行實(shí)時動畫仿真的方法,并給出了實(shí)現(xiàn)框架以及與現(xiàn)有方法的模擬結(jié)果對比。本文所提方法能夠得到實(shí)時的模擬結(jié)果,三維水滴與二維水滴能夠互相轉(zhuǎn)換并在轉(zhuǎn)換后繼續(xù)進(jìn)行仿真計(jì)算與渲染,解決了已有降維模擬方法中水滴無法離開紋理空間的問題,使得模擬不再依賴于連續(xù)曲面。但本文沒有對三維水滴在空氣中的物理仿真作詳細(xì)討論,也沒有使用GPU對模擬進(jìn)行加速,這些需要在今后的工作中加以改進(jìn)。