胡中天,
(浙江科技學院 信息與電子工程學院,杭州 310023)
三維場景的真實感與實時繪制一直是相關研究領域的熱點問題。在實際應用中為增強雨天的真實感,通常在場景中加入實時模擬的降雨效果。現有方法多采用基于粒子系統[1-2]或圖像后處理[3]的模擬方法,這些方法能夠較好地模擬雨點的真實物理運動,但模擬出的雨滴無法與場景中的物體產生真實的交互。為解決流體與物體的交互問題,提出了各種流體模擬方法,現有方法主要有3種:基于歐拉的網格法[4],基于拉格朗日的粒子法[5]以及混合法[6],這些方法本質上都基于納維-斯托克斯方程。但由于忽略了水滴對物體表面的黏附力、水滴自身的表面張力等因素,導致了這些方法更適用于大規模水體模擬。同時,隨著當下三維模型精度的提高,無論采用以上哪種方法進行三維物體表面水滴運動的模擬都需要遍歷大量模型頂點數據,開銷較大。因此,仍需深入研究如何精確高效地實現水滴規模的流體模擬。
文獻[7]提出一種玻璃板上基于格點的水滴運動啟發式模擬方法,物理仿真時考慮了水滴的黏附力與表面張力,得到了較真實的模擬結果。文獻[8]在仿真計算中還引入了接觸角模型以模擬水滴在斜面上的運動狀態。但以上方法只適用于平面上的水滴運動。
文獻[9]基于顯示曲面法模擬了水滴的固液交互現象。文獻[10]通過為淚滴運動尾跡建立獨立三維網格的形式模擬了流淚動畫。這2種方法都實現了液滴與任意形狀物體表面的交互,但計算過程繁瑣。文獻[11]在光滑粒子動力學(Smoothed Particle Hydrodynamics,SPH)模型中引入表面張力項與黏性項,克服了SPH等流體模型不能直接應用于水滴運動模擬的問題。文獻[12]也使用類似方法模擬了虛擬人流淚與流汗情境,但模擬效率不高。文獻[13]提出一種基于SPH的流淚動畫降維模擬方法,采用切空間變換將物理仿真變換到二維空間,徹底避免了三維空間下的點-面碰撞開銷問題。但該文對于離開二維仿真空間的淚滴只是簡單地作刪除處理,導致了模擬依賴于連續的曲面。
綜合以上分析,已有模擬方法可分為2類:三維模擬方法與降維模擬方法。前者在三維空間下模擬水滴運動,使用三維網格渲染水滴,通常存在因計算開銷較大而導致模擬效率不高的問題;后者則在二維空間內模擬水滴運動,使用法線貼圖渲染水滴,效率較高但存在水滴無法離開紋理空間的局限性問題。為解決以上方法中存在的問題,本文提出一種三維與二維混合的物體表面水滴運動模擬方法,基于坐標空間變換實現2種水滴類型的轉換,轉換后的水滴繼承之前水滴的位置、質量與速度。三維水滴采用三維網格渲染,紋理空間內的二維水滴采用法線貼圖渲染。
已有降維模擬方法均假設水滴不會從紋理空間滴落到三維空間,水滴直接在紋理空間內產生也消失于紋理空間。例如文獻[13]的仿真模型中雖然討論了切空間下水滴所受壓力場為負值導致水滴離開紋理空間的情況,但沒有進一步討論這種情況下水滴的運動而是直接將其從仿真集合中刪除。為解決這種局限性問題,本文在進行仿真計算時將水滴分為2種類型:三維水滴與二維水滴,這2種水滴類型能夠互相轉換并繼承物理屬性。三維水滴與物體表面發生碰撞時,轉換為二維水滴;二維水滴在達到臨界條件后,轉換為三維水滴,轉換過程如圖1所示。

圖1 水滴轉換過程
而對于水滴之間融合、分離等細節現象的模擬,相對于顯示曲面方法[9]以及SPH方法[11-13]在水滴數量增多時模擬效率下降明顯的情況,本文方法先將紋理空間內的水滴粒子作為剛體進行物理仿真,再通過對紋理圖像的處理獲得細節效果,以獲得更快且更穩定的模擬效率。紋理空間內二維水滴的處理流程如圖2所示。

圖2 二維紋理空間水滴仿真流程
為實現水滴類型的轉換,首先要實現世界空間坐標到對應紋理空間坐標的轉換。模型表面的局部空間坐標經過旋轉、平移、縮放后得到其所在的世界坐標。首先求解旋轉變換矩陣,模型分別繞Z軸、X軸以及Y軸旋轉角的變換矩陣為:


(1)
令D=A·B·C,D即為旋轉變換矩陣。
模型沿X、Y、Z坐標軸分別平移Tx、Ty、Tz距離的平移變換矩陣為:
E=[TxTyTz]
(2)
模型沿X、Y、Z坐標軸分別縮放Sx、Sy、Sz倍的縮放變換矩陣為:
故對世界空間中水滴與曲面發生碰撞的一點(x,y,z),可得局部空間下的碰撞點(x′,y′,z′):
[x′y′z′]=[xyz]·D-1·F-1-E
(4)
通過(x′,y′,z′)即可查詢到對應的UV坐標點(u,v),至此即完成了世界空間下的物體表面坐標到對應紋理空間坐標的轉換。
為了對紋理空間內水滴的物理仿真進行降維處理,世界空間下的外力需要進行切空間變換。局部空間下的力由沿局部坐標系3個坐標軸方向的分量Fx、Fy、Fz組成,從世界空間到局部空間的變換矩陣為:
紋理空間由三角形面片劃分,對應模型曲面的每個三角形面片的切向T、B分量,于是可得其法向量:
N=T×B
(6)
從紋理空間到局部空間的變換矩陣為:
得到以上變換矩陣后,將世界空間下的重力G與風力Fw變換到紋理空間:
紋理空間下的重力與風力場即為FWG(u,v)=(Fu,Fv),壓力場即為FN(u,v)=Fn。
完成水滴坐標的轉換后,還需要對水滴的速度與受力進行轉換。三維水滴在世界空間受到重力、風力、空氣阻力、空氣浮力等作用運動,在轉換到紋理空間后,二維水滴受到紋理空間下的重力、風力、壓力、水滴與物體表面間的摩擦力、吸附力以及水滴自身表面張力影響;對于初速度,三維水滴進入紋理空間后,由變換矩陣得到其在紋理空間下的3個速度分量:
于是轉換得到的二維水滴的初速度即為:
Vuv(0)=Vu+Vv
(10)
而對于進入世界空間的二維水滴,轉換時還需要計算其法向速度分量,即轉換得到的三維水滴的初速度為:
(11)
本文的水滴運動物理仿真主要發生在物體表面即紋理空間,物理計算過程可以描述為:對于給定大小的二維紋理空間,給定水滴的初始位置向量X(0)、初速度V(0)、自身質量m、對物體表面的吸附力Fadhension、表面張力Ftension、靜摩擦力Fs、動摩擦系數μ、重力加速度g,重力與風力場FWG(u,v)、定義時間步為dt,求解二維立面上水滴的運動軌跡方程。其中,X(0)由三維水滴與物體的碰撞點確定,X(0)為碰撞瞬間水滴速度在物體表面的切向分量。
圖3為一顆二維立面上的水滴,FN為切空間法向方向的力,即水滴受到的壓力,Ff為摩擦力,Fu與Fv為重力與風力在切空間切向的2個分力。

圖3 水滴粒子受力圖
壓力FN方向上水滴受到水滴與表面間的吸附力與自身表面張力以及壓力場影響,有:
FN=Fadhension+Ftension+Fn
(12)
其中,Ftension=k/|ρ|表示水滴與曲面之間由于彎曲趨勢產生的表面張力。于是可得到水滴受到的滑動摩擦力大小為:
|Ff|=μ|FN|
(13)

FTB(t)=Fu+Fv+Ff
(14)
由式(5)可得水滴此時的切向加速度a(t)為:
當水滴粒子達到臨界狀態時,水滴即離開紋理空間進入三維空間,臨界狀態包括2種:1)水滴粒子在紋理空間運動時超出了限定的UV坐標范圍;2)水滴粒子受到的壓力FN為負值。
水滴運動軌跡方程采用velocity-verlet積分算法計算,速度表達式為:
位置表達式為:
將式(5)、式(6)代入式(7)、式(8),得t+dt時刻下的水滴速度與位置表達式為:

繪制高度圖時,任意水滴的中心點灰度值為:

(21)
然后將高度圖轉換為法線紋理,對于紋理空間內任一像素點,其RGBA值為(Δx,Δy,1,1)。其中:

lgrayScale、rgrayScale、ugrayScale、dgrayScale分別為該像素點左右上下的像素灰度值。水滴的反射與折射效果通過抓取屏幕背景截圖并基于法線貼圖對其UV進行扭曲、偏移的方式渲染。
實驗在Unity 3D引擎中進行,系統運行在一臺Intel Core i5-4210U CPU @ 1.70 GHz四核CPU,NVIDIA GeForce 820M顯卡的計算機上,Unity 3D版本為5.3.4f1(64 bit),實驗中計算的二維水滴紋理分辨率為1 600像素×900像素大小。
實驗分為2個部分,第1部分負責三維水滴的物理仿真與渲染,第2部分負責二維水滴的物理仿真與渲染。
第1部分的大致處理流程如圖8所示。預處理階段產生質量大小不同的三維水滴,實驗中采用的三維水滴網格為方形面片。三維水滴通過物理仿真下落到物體表面,在碰撞點處轉換為紋理空間的二維水滴。

圖8 第1部分處理流程
第2部分的大致處理流程如圖9所示。二維水滴繼承三維水滴的質量大小與速度,預處理階段完成數據的轉換,之后水滴在紋理空間內繼續進行物理仿真,達到臨界條件后從物體表面紋理空間離開,再次轉換為三維水滴。

圖9 第2部分處理流程
圖10所示為水滴在非連續曲面上運動的模擬結果,場景中僅包括重力,三維水滴在滴落過程中經過2個不連續的平面,經歷4次轉換。圖11所示為2個平面的紋理圖像模擬結果,顯示了水滴在2個平面上的運動留下的尾跡。

圖10 非連續曲面的滴落

圖11 2個平面的紋理貼圖模擬結果
如圖12所示為本文方法實現的模擬結果與實拍照片的對比。

圖12 各種情況下的雨滴運動模擬
圖13所示為實拍照片及不同方法在球體表面的水滴運動模擬結果對比。

圖13 球體表面水滴運動模擬結果
普通三維SPH方法因為模擬中未加入黏性項與表面張力項,水滴粒子與球體表面發生碰撞后無法沿曲面滑下,產生了錯誤的模擬結果,而加入了黏性項與表面張力項的改進三維SPH方法則能夠得到正確的模擬結果。降維SPH模擬方法中水滴被繪制在法線紋理上,以貼圖方式渲染,水滴能夠沿著曲面滑落但不能離開紋理空間。在本文方法的模擬結果中,水滴粒子分為2種類型,在紋理空間外水滴粒子以三維網格渲染,而處于物體表面紋理空間內的水滴粒子則以法線貼圖方式渲染,水滴能夠產生正確的運動軌跡且能夠離開紋理空間。
圖14-圖16所示為不同風力環境下不同方法的虛擬人流淚模擬結果對比。

圖14 風力(0.0,0.0,0.0)的模擬結果對比

圖15 風力(10.0,0.0,0.0)的模擬結果對比

圖16 風力(0.0,0.0,5.0)的模擬結果對比
圖17為各方法模擬水滴融合產生液體橋現象的結果。基于顯示曲面的模擬方法中,2個水滴只是簡單疊加,而基于SPH的方法與本文基于圖像處理算法的方法則在水滴間產生了良好的融合效果。

圖17 液體橋模擬結果對比
圖18所示為降維SPH與本文方法模擬的流經物體表面水滴留下的尾跡,圖18(a)為降維SPH模擬結果,圖18(b)~圖18(e)為本文方法模擬結果,從左至右尾跡的插值細分值分別為0、1、2、3。本文方法能夠更靈活地獲得需要的尾跡效果。

圖18 尾跡模擬結果對比
表1為三維SPH、降維SPH以及本文方法在不同粒子數情況下的模擬效率對比,模擬系統中使用的模型三角面片數超過10 000個。表2為不同方法在不同三角面片數模型表面模擬的效率對比,模擬系統中最大粒子數為5 000個。在同等條件下,本文方法的模擬效率相比基于SPH的二維與三維模擬方法分別提高了2倍與5倍以上。

表1 各方法在不同粒子數下模擬的平均幀速率 frame/s

表2 各方法在不同面數模型表面模擬的平均幀速率 frame/s
在現有方法中,三維空間下的模擬方法往往存在計算開銷大、效率低的問題,而降維模擬方法又存在水滴只能在紋理空間內模擬的局限性問題。本文結合了三維與二維模擬方法的特點,提出了一種實時水滴運動仿真方法。該方法效率更高,且水滴粒子能夠在世界空間與紋理空間之間進行轉換。
本文提出了一種能夠對物體表面的水滴運動進行實時動畫仿真的方法,并給出了實現框架以及與現有方法的模擬結果對比。本文所提方法能夠得到實時的模擬結果,三維水滴與二維水滴能夠互相轉換并在轉換后繼續進行仿真計算與渲染,解決了已有降維模擬方法中水滴無法離開紋理空間的問題,使得模擬不再依賴于連續曲面。但本文沒有對三維水滴在空氣中的物理仿真作詳細討論,也沒有使用GPU對模擬進行加速,這些需要在今后的工作中加以改進。