劉宇涵,賈江凱,唐 勇,陶建新,張金鐘,任小霞
1(燕山大學 信息科學與工程學院,河北 秦皇島 066004)2(河北省計算機虛擬技術與系統(tǒng)集成重點實驗室,河北 秦皇島 066004)
布料模擬在計算機圖形學中占很大的比重,但在游戲中,模擬布料撕裂的效果嚴重失真.相比布料其它運動行為的模擬,布料撕裂導致網(wǎng)格結(jié)構(gòu)的改變以及撕裂軌跡的難以捉摸,使得布料撕裂模擬的研究更具有挑戰(zhàn)性.
20世紀80年代開始,大量科學家致力于計算機模擬布料撕裂的研究.1998年,Terzopoulos和Fleischer等人[1]在展示了一種撕紙和模擬布狀材料的技術,給布料撕裂模擬研究提供了借鑒.2007年,Sifakis等人[2]使用虛擬節(jié)點法,在虛擬元素中嵌入裂縫,降低布料的穩(wěn)定性,然而這種方法限制了裂縫傳播的準確性,需要規(guī)定撕裂軌跡.2009年,kaufmann等人[3]嵌入XFEM可以準確地解決規(guī)定撕裂軌跡的問題,但是對軌跡的幾何形狀進行了限制,且計算代價太大.2009年,Metaaphanon N 等人[4]使用標準連續(xù)表單模型和紗線級模型,模擬出逼真的布料撕裂邊緣的磨損效果.正是因為兩層模型的使用,實驗模擬速度達不到實時.2014年,Souza M S等人[5]提出一種使用Half-edge結(jié)構(gòu)的查找方法解決布料的撕裂模擬,提高了計算速度,但是降低了真實感.國內(nèi)方面,2016年,唐勇等人[6]提出一種多形態(tài)布料與物體實時碰撞與檢測的方法,成功處理了布料與物體之間的碰撞問題.同年,Bi W 等人[7]研究了人體視覺對不同屬性的布料感知的恒定常數(shù),主要分析視覺系統(tǒng)在抵消了外力的影響后,對布料屬性的感知,但對于不同屬性的布料在風場中的模擬缺乏真實感.2017年,Camille Schreck等人[8]提出了一種交互式建模背景下的撕紙方法,通過幾何信息來自動檢測撕裂路徑上潛在的撕裂點,但是只能用于模擬低分辨率網(wǎng)格的紙片,不能有效地處理高分辨率的網(wǎng)格.同一年,Vassilev T I[9]改進質(zhì)點彈簧模型,并將其運用在虛擬人體穿衣的系統(tǒng)中.2018年,Li J等人[10]提出一種用于自適應布料模擬摩擦、碰撞的解算器,應用于虛擬人體穿衣.2018年,Oh Y J等人[11]將層次模擬與深度神經(jīng)網(wǎng)絡相結(jié)合來模擬布料的摩擦、碰撞,計算布料碰撞的同時降低了時間成本,但未考慮底層網(wǎng)格對頂層網(wǎng)格質(zhì)點的自適應變化.所以目前的層次模型不適合布料撕裂的模擬.
綜上,布料撕裂模擬時,通過預先規(guī)定撕裂軌跡的模型其適應性較差,高分辨率網(wǎng)格計算消耗過大,實時性較差.本文通過使用基于位置動理學方法并引入撕裂率,以幾何方法計算破損點周圍質(zhì)點撕裂率,準確預測下一個被撕裂質(zhì)點的位置,避免規(guī)定撕裂軌跡的問題;優(yōu)化Half-edge查找算法,提高布料撕裂模擬速度.
在計算機圖形學中,尤其是在計算機游戲中,通常希望直接控制網(wǎng)格的對象或頂點的位置.經(jīng)典的布料建模方法有:有限元法、質(zhì)點彈簧模型以及基于位置動力學.有限元方法能夠精確地模擬布料運動效果的同時,計算消耗大,遠達不到實時性的要求;質(zhì)點彈簧模型難以權(quán)衡精度和速度的追求,不適合高分辨率的實時模擬;基于位置動力學方法,使用各種約束方程跳過速度的計算,直接對質(zhì)點位置起作用,使得布料系統(tǒng)在實時交互模擬方面占有巨大優(yōu)勢.
基于位置動力學方法的核心是布料內(nèi)部受力保持線性動量公式(1)和角動量守恒公式(2).
(1)
(2)
其中,mi為質(zhì)點的質(zhì)量,pi為單位時間內(nèi)位置的變化量,ri為質(zhì)點的旋轉(zhuǎn)半徑.滿足約束方程C(p+Δp)=0后,即可預測下一幀質(zhì)點位置的變化量△p.由泰勒展開得公式(3).
C(p+Δp)≈C(p)+pC(p)·Δp
(3)
本文引入基于位置動力學方法跳過速度層,直接操縱質(zhì)點位置的變化,提升了布料模擬的速度,更適合高分辨率布料網(wǎng)格的實時模擬.在保證布料模擬實時性的同時,模擬出更加逼真自然的撕裂效果.
布料模擬中,其撕裂現(xiàn)象與摩擦、碰撞的區(qū)別在于布料網(wǎng)格的改變.當網(wǎng)格邊受力超過指定的閾值時,選擇分裂其相鄰的兩個質(zhì)點,如果兩個質(zhì)點都可以被分裂,那么選擇分裂質(zhì)量高的質(zhì)點,完成布料網(wǎng)格撕裂效果.而拉伸與碰撞由于受力方向不同,對于網(wǎng)格質(zhì)點分裂也有區(qū)別.
如圖1所示,在布料受到拉伸力引起的布料撕裂時,拉伸力與布料的處于同一平面上.在分裂質(zhì)點確定之后,分裂出一個質(zhì)點便可以達到布料撕裂的效果.
如圖2所示,當布料與物體碰撞時,受力與布料處于不同的平面.在分裂質(zhì)點確定之后,質(zhì)點共享的面片數(shù)量確定需要分裂的質(zhì)點數(shù)量.
初次撕裂中網(wǎng)格質(zhì)點分裂后,被分裂與分裂出的質(zhì)點被稱為破損點.張力持續(xù)在破損點附近增加時,撕裂傾向于繼續(xù)擴大已撕裂的部分.破損點周圍的質(zhì)點在撕裂過程中受到影響,抗撕裂值降低.
圖1 拉伸引起的網(wǎng)格撕裂Fig.1 Mesh tear caused by stretching
預先規(guī)定撕裂軌跡的原因是不能有效預測下一個撕裂質(zhì)點的位置.本文通過計算破損部位周圍質(zhì)點撕裂率(tearValue),預測下一個最可能被撕裂質(zhì)點位置.其原理是找到與力垂直方向角度相近邊,這條邊是力的主要對抗邊.本文將力方向的垂直軸近似為撕裂線p2-p1,然后根據(jù)點積計算相鄰粒子被撕裂的概率,如公式(4)中所示.
(4)
其中p1和p2是撕裂邊緣矢量的兩個頂點,p1是當前步驟的撕裂點,vicinity是p1周圍的質(zhì)點,(vicinity-p1)是可用的下一個撕裂邊緣矢量.在撕裂過程中,下一個邊與撕裂邊緣之間的角度越大,其撕裂發(fā)生概率隨tearValue線性增加.確定質(zhì)點tearValue最大值之后,修改該質(zhì)點的抗撕裂值(tearRes),方法如公式(5)中所示:
tearRes*=1-tearDeb
(5)
圖2 碰撞引起的網(wǎng)格撕裂Fig.2 Mesh tear caused by collision
本文通過引入Half-edge數(shù)據(jù)結(jié)構(gòu)查找算法,為網(wǎng)格面片提供快速鄰接查詢,解決布料撕裂模擬中計算消耗大的問題,提升布料撕裂模擬速度.如圖3所示為Half-edge結(jié)構(gòu)圖.
邊e由e1和e2組成,每個邊(He_edge)的結(jié)構(gòu)體中包括相應的邊和下一條邊以及半邊所在的三角面.Half-edge數(shù)據(jù)結(jié)構(gòu)包括He_vert、He_edge以及He_face三種結(jié)構(gòu)體.
實驗數(shù)據(jù)表明:Half-edge數(shù)據(jù)結(jié)構(gòu)的表示方法形成的結(jié)構(gòu)體數(shù)量過多會增加計算開支.本文對Half-edge數(shù)據(jù)結(jié)構(gòu)進行優(yōu)化:將Half-edge數(shù)據(jù)結(jié)構(gòu)中He_edge、He_face的結(jié)構(gòu)體抽取融合,來減少運算中生成的結(jié)構(gòu)體.本文將融合后的數(shù)據(jù)結(jié)構(gòu)定義為ModEdge,如表1所示.
ModEdge數(shù)據(jù)結(jié)構(gòu)抽取出了Half-edge半邊數(shù)據(jù)結(jié)構(gòu)的主要信息,減少布料模擬過程中生成結(jié)構(gòu)體的數(shù)量,達到提升布料的撕裂模擬運算速度的目的.
圖3 Half-edge結(jié)構(gòu)圖Fig.3 Half-edge Structure diagram
本文在Windows 10操作系統(tǒng),Unity3D上使用C#實現(xiàn)了本文所述的算法,硬件系統(tǒng):Intel(R)Core(TM)i7 CPU 4790 3.60GHz,8G RAM和NVIDIA Geforce GTX1060.本文已經(jīng)進行了各種實驗來分析所提出方法的性能.
表1 ModEdge 數(shù)據(jù)結(jié)構(gòu)
Table 1 ModEdge deta structure
ModEdge數(shù)據(jù)結(jié)構(gòu)structModEdge{intp1;inttriangleId1;intp2;inttriangleId2;intid;booltear;intpair;floatrest_length;}
表2以評估分裂頂點程序的性能記錄了本文方法與文獻[5]中拉伸造成的撕裂模擬實驗數(shù)據(jù)對比,數(shù)據(jù)表明:當分辨率提高后,本文的方法在平均時間消耗上更少,在100*100的網(wǎng)格模擬中,減少一半的時間消耗.
表2 性能測試對比
Table 2 Performance test comparison
三角面數(shù)量方法 平均時間(ms)20?2040?4060?6080?80100?100文獻[5]15183762本文方法1213151730
圖4中,a1…a5是文獻[5]的實驗效果,b1…b5是本文的實驗效果.由布料褶皺的多少可以看出,本文實驗所用的布料分辨率更高,撕裂效果更逼真自然.
圖5中網(wǎng)格質(zhì)點數(shù)為2540,實驗模擬拉伸力造成布料的撕裂效果.固定布料的兩邊,并拉動布料的左側(cè).布料在極短的時間內(nèi)破裂,并發(fā)生回彈的現(xiàn)象.使用改進的布料撕裂的算法,能夠?qū)崟r模擬逼真的撕裂效果.
通過以上實驗可以看出:本文方法使用高分辨率網(wǎng)格模擬布料由于拉伸引起的撕裂,且能滿足實時性的需求.
圖6(a)是文獻[11]布料在風場中受風力影響抖動的模擬,圖6(b)是本文模擬風場中布料的撕裂過程.因為布料在風場中受到的風力始終在風向的小幅度內(nèi)變動,所以布料在風場中受到垂直風場方向的切割,引發(fā)布料撕裂的現(xiàn)象.圖6(a)文獻[11]中布料褶皺的模擬僵硬、不自然;圖6(b)為本文方法,使用3600個質(zhì)點模擬了布料抖動現(xiàn)象的同時,加入撕裂效果.
圖4 布料拉伸的撕裂Fig.4 Cloth stretch tear
圖5 雙邊固定布料拉伸的撕裂Fig.5 Bilateral fixed fabric stretch tear
圖7是模擬剛體與布料的交互效果,圖7(a)模擬單個球體與布料的碰撞.圖7(b)展示兩個鄰近的球體與布料的碰撞,模擬出兩個球體碰撞生成一個撕裂軌跡的效果.圖7(c)模擬不同位置、不同碰撞時間造成的撕裂效果.多組實驗數(shù)據(jù)表明:本文方法在受到風場切割以及剛體碰撞的條件下,都能生成自然的布料撕裂效果.
圖6 風場中布料的撕裂Fig.6 Tearing in the wind field
由以上實驗數(shù)據(jù)可以看出,在布料拉伸、碰撞情境下,能夠?qū)崟r模擬出逼真、自然的撕裂軌跡.
本文通過優(yōu)化Half-edge數(shù)據(jù)結(jié)構(gòu)查找算法,并計算破損點周圍質(zhì)點的撕裂率值,成功完成拉伸、碰撞下布料撕裂的實時模擬.基于位置動力學方法規(guī)避了速度層的計算,直接控制布料質(zhì)點的位置,大大縮減了布料質(zhì)點和場景的交互時間,提高了布料模擬計算速度;利用幾何法預測破損點周圍最可能被撕裂的頂點,成功解決了撕裂軌跡不真實、需要提前規(guī)定撕裂軌跡的問題;考慮到布料撕裂模擬過程中,質(zhì)點查找算法的重要性,在Half-edge的基本思想下,融合邊、面結(jié)構(gòu)體,減少撕裂模擬過程中生成的結(jié)構(gòu)體數(shù)量,提升撕裂模擬速度.今后的研究中,我們將繼續(xù)探索撕裂過程中不同屬性布料的撕裂效果,進一步增加布料撕裂模擬的真實性.
圖7 碰撞下的布料撕裂模擬Fig.7 Fabric tearing simulation under collision