文/郝笑弘
在我們平時的學習和生活中,隨處都可以接觸到計算機實時動畫技術,比如炫目的3D動畫電影、游戲人物等。在物理模型下進行實時動畫設計,充分考慮各種外力形式對布料等模型的形變作用,可以達到動態仿真效果,使計算機模擬動畫充分反映出現實世界的物理規律,從而給人帶來更加真實的視覺感。對計算機實時動畫技術進行分析,有利于提高我們的計算機和物理學應用能力。
本次設計的布料實時動畫以Visual C++為開發平臺,采用C++語言和OpenGL 圖形API。OpenGL 是一款功能強大的計算機三維圖形接口,包含120 多個圖形函數庫,支持幾何模型構建和動態仿真。初學者也可以快速上手應用,軟件開發難度較低。OpenGL 的三維場景交互程度高,渲染效果逼真,性能非常卓越。采用OpenGL 三維圖形設計界面,可以滿足本次設計的軟件需求。物理引擎則選擇Physx 引擎,可以自動引入牛頓動力學原理,增加系統交互性,高度模擬自然界中的物體特征,得到較為逼真的模型和動畫效果。在上述模擬環境配置條件下,我們可以將布料模型設計為具有質量的三角網格模型,遵循牛頓第二定律進行設計,為仿真效果提供保障。
從上述分析可知,質點-彈簧模型易于計算和實現,因此在計算機實時動畫制作中得到了廣泛應用。本文采用該模型構建的布料模型由一系列均質、離散化的質點組成,質點之間連接有不同類型的彈簧,假定彈簧長度不為零,且不考慮其質量,加入彈簧的目的是模擬布料紗線之間的相互作用力。布料紗線的內部作用力可分為結構力、彎曲力和剪切力,因此彈簧也分為三種類型,即結構彈簧、彎曲蛋黃和剪切彈簧。通過三種彈簧的應用,可以充分模擬布料的各種運動形式,獲得真實的視覺感。此外,還要考慮布料所受的外力作用,模擬布料在下落、懸掛或與其他物體發生接觸時的運動狀態。可以將外力分為重力、摩擦力和空氣阻力等。其中,重力使布料模型各質量的重力之和,空氣阻力能夠減緩彈簧拉伸形變,使布料模型逐漸趨于穩態。
在布料的質點-彈簧模型動畫模擬過程中,若將布料某一點固定,此時受到的拉伸力如果過大,會導致布料被撕裂或斷開。在拉力作用質點附近,彈簧會出現超形變現象,而遠離拉力作用點的質點拉伸長度則接近正常,這種現象被稱為布料的超彈性形變,是布料動畫模擬過程中需要處理好的問題。在布料質點-彈簧模型的模擬過程中,為方便計算,通常假設彈簧彈性因子為線性變化,但在實際受力情況下,其形變并不完全符合線性規律,這是超彈性形變問題的根本成因。另一方面,布料動畫的幀刷新速度要能夠被人的肉眼所接受,實時動畫仿真對畫面更新率有較高要求,需要適當降低動畫時間步長,過大的時間步長也會引發超彈性形變問題。
針對這一問題,傳統的解決算法主要包括基于質點速度的修正方法和基于質點位置的修正方法。其中,質點位置修正法是由Provot等人基于逆向動力學原理提出的修正方法。在每個時間步長模擬結束后,對各質點位置進行計算,進而計算彈簧拉伸鋁,如果超過最大拉伸率的設定值,就對彈簧兩端質點的位置進行修正,將彈簧拉伸率控制在最大拉伸率范圍內。基于速度的修正方法最早由Vassilev 提出,是在每個時間間隔結束后對彈簧拉伸率進行檢查,與預先設定值進行比較,根據實際拉伸率與設定閾值的關系,對質點速度進行修正。該方法后來經House.tal 和Bridson 等人的改進,修正效果有所提高,但總體來看,修正效率較低,且約束不嚴格,可能會再次引起超彈性形變為。
針對傳統解決算法的不足,目前又提出一種新的解決方法,即基于拉伸張量的排序算法,該方法針對布料超彈性形變的特征和形成原因,采用拉伸張量對質點進行倒序排列,優先對拉伸張量值較大的質點狀態進行調整,采用迭代算法進行排序和更新,可以明顯提高超彈性形變問題的處理效率,滿足實時動畫模擬效果要求。
本文采用經過優化的AABB 層次包圍盒法實現碰撞檢測,該方法對三角化的布料模型和待碰撞物體建立層次包圍盒二叉樹,遍歷兩棵發生碰撞的二叉樹,判斷重疊區域,檢測某個動畫時間點,布料與其他物體的碰撞情況。AABB 包圍盒法的應用分為兩個階段,即初步檢測階段和詳細檢測階段。在初步檢測階段,通過判斷包圍盒在三個坐標軸的投影情況,判斷包圍盒是否存在相交,若包圍盒的投影都重疊,則兩包圍盒必然相交,若至少有一個投影布重疊,則不發生相交,從而將三維碰撞檢測轉化為一維空間的碰撞檢測問題。在湘西檢測階段,主要應用直線-三角形碰撞檢測方法,判斷碰撞是否發生,并執行碰撞響應函數。采用上述碰撞檢測方法,可以同時滿足計算機動畫模擬的真實性和實時性要求。
綜上所述,通過對計算機實時動畫的實現原理和實現方法進行分析,可以了解到計算機實時動畫制作的關鍵技術,明確模擬平臺的配置條件。在此基礎上,構建合理的計算機動畫模型,做好超彈性處理和碰撞檢測,可以使動畫效果接近真實,并滿足實時性要求。通過本次研究和實踐,使我對三維動畫的制作有了一個新的認識,并在查閱資料和實踐過程中,提高了知識技能的應用能力。