今年,我們的國(guó)產(chǎn)游戲《黑神話·悟空》斬獲了多個(gè)國(guó)際游戲獎(jiǎng)項(xiàng)。最近,游戲又出了更新,不少人也是興沖沖重新下回黑神話準(zhǔn)備再體驗(yàn)一把八十一難。
然而有些人玩著玩著不免好奇,游戲中物理過(guò)程做的那么真實(shí),比如水中漣漪、雪中行進(jìn)痕跡等,這些是如何做到的呢?為什么會(huì)出現(xiàn)這些有趣的現(xiàn)象?這些現(xiàn)象又對(duì)物理學(xué)本身有什么啟發(fā)?下面我們一起來(lái)走進(jìn)游戲中的物理世界吧。
碰撞檢測(cè),虛擬中“硬物體”
在經(jīng)典的物理世界中發(fā)生最多的事件莫過(guò)于碰撞了,所以要想游戲中足夠真實(shí),那么碰撞是一定是最先需要考慮的過(guò)程。
先看看經(jīng)典世界的碰撞是如何發(fā)生的。
F 為物體所受的凈力,m 為物體的質(zhì)量,a 為加速度。通過(guò)對(duì)每一時(shí)刻物體所受合力和合力矩進(jìn)行計(jì)算,我們可以得到現(xiàn)實(shí)生活中物體的物理狀態(tài)。同樣的,回到我們游戲世界,物理引擎可以利用這個(gè)方法更新其速度與位置。
Unity 3D 中模擬碰撞
在計(jì)算機(jī)中,這通常通過(guò)數(shù)值積分方法實(shí)現(xiàn),如歐拉法、龍格-庫(kù)塔法,或更為穩(wěn)定和高級(jí)的半隱式積分器等。在游戲中通常優(yōu)先考慮計(jì)算效率與穩(wěn)定性,以保證在每幀刷新中都能快速得到近似準(zhǔn)確的物體位置和狀態(tài)。
但是由于我們都知道,現(xiàn)實(shí)世界從經(jīng)典上看是連續(xù)的,但是游戲世界的模擬需要根據(jù)每個(gè)物體的狀態(tài)一幀一幀更新每個(gè)物體的位置。物理模擬所用的幀率越高,計(jì)算結(jié)果肯定就越精確。
例如我們計(jì)算兩個(gè)小球?qū)ψ?,?dāng)發(fā)生碰撞時(shí)根據(jù) 2 個(gè)小球的速度大小、速度方向、材質(zhì)、碰撞深度來(lái)計(jì)算這次碰撞的結(jié)果,同時(shí)更新 2 個(gè)小球的狀態(tài)。但是現(xiàn)實(shí)世界中兩個(gè)剛性物體是不會(huì)發(fā)生“重疊”的,真正的碰撞發(fā)生在 2 個(gè)小球接觸的瞬間或者從接觸到形變到碰撞結(jié)束的整個(gè)過(guò)程中
游戲中重疊產(chǎn)生碰撞的例子
但物理引擎由于是一幀一幀更新位置、計(jì)算碰撞結(jié)果,無(wú)法保證碰撞的時(shí)間點(diǎn)正好在某一幀上,也無(wú)法真正完全動(dòng)態(tài)模擬 2 個(gè)小球從接觸到離開過(guò)程中的每一個(gè)細(xì)微變化,2 幀中間的碰撞信息其實(shí)是丟失了的,這就會(huì)導(dǎo)致有很多更加復(fù)雜的碰撞在有些時(shí)候看起來(lái)是非常反直覺(jué)的。
現(xiàn)在的許多成熟的游戲引擎已避免了這個(gè)問(wèn)題,將游戲的計(jì)算幀率與現(xiàn)實(shí)幀率分開。但是影響碰撞的還不僅僅是幀率這一個(gè)因素。
實(shí)際游戲過(guò)程中的建模為了美觀是非常復(fù)雜的,從模型來(lái)說(shuō)一般來(lái)說(shuō)有幾千個(gè)三角面。但是物理引擎在計(jì)算這些原始的模型碰撞時(shí)計(jì)算量會(huì)幾何程度遞增,或者由于某個(gè)比較奇怪的建模角度,碰撞計(jì)算會(huì)給出與現(xiàn)實(shí)出入較大的結(jié)果。所以我們需要簡(jiǎn)化物體的物理外形,這也就是我們游戲中常說(shuō)的碰撞體積。
除此之外,還有材質(zhì)、摩擦力、空氣阻力、擠壓現(xiàn)象等都是碰撞中需要考慮的問(wèn)題。
約束:受限制的自由
除了剛體的碰撞外,游戲中自然少不了許多部件的連接與轉(zhuǎn)動(dòng),這就是約束這一物理概念在背后起作用。例如,游戲中的小人要想抓取一個(gè)物體,就相當(dāng)于手與物體的接觸面產(chǎn)生了約束。
在物理引擎中,約束(Constraints)用于限制物體的運(yùn)動(dòng)范圍和相對(duì)位置。它們?cè)谟螒蚝头抡嬷杏兄鴱V泛的應(yīng)用,如角色的骨骼動(dòng)畫、機(jī)械臂、車輪等。在模擬過(guò)程中,如果做不好約束很可能得到非常奇怪的游戲畫面。
在經(jīng)典力學(xué)中,約束是描述系統(tǒng)中物體或物體之間相互關(guān)系的條件。約束力學(xué)是研究如何在一個(gè)多物體系統(tǒng)中考慮運(yùn)動(dòng)的限制條件的分支。根據(jù)自由度的不同,物體之間的相對(duì)運(yùn)動(dòng)受到不同類型的限制。
在物理引擎中,約束通常通過(guò)數(shù)學(xué)方程來(lái)描述,并基于經(jīng)典力學(xué)中的拉格朗日力學(xué)(Lagrangian Mechanics)和牛頓力學(xué)(Newtonian Mechanics)來(lái)求解。
物體之間的相對(duì)運(yùn)動(dòng)由施加在物體上的約束力(Constraint Forces)決定,這些約束力使得物體遵循約定的運(yùn)動(dòng)軌跡,防止它們發(fā)生不符合物理規(guī)律的運(yùn)動(dòng)。具體來(lái)說(shuō),約束力通過(guò)改變物體的加速度來(lái)限制其自由度,從而確保其運(yùn)動(dòng)不會(huì)違反約束條件。
人物的關(guān)節(jié)就是一種約束形式,稱為鉸鏈關(guān)節(jié),它允許兩個(gè)物體繞一個(gè)軸旋轉(zhuǎn),同時(shí)限制其他自由度。其物理學(xué)原理可以追溯到轉(zhuǎn)動(dòng)慣量(Moment of Inertia)和角動(dòng)量守恒(Conservation of Angular Momentum)。
在實(shí)際的游戲中,約束同樣存在計(jì)算量限制的問(wèn)題,需要簡(jiǎn)化計(jì)算量,所以游戲中通常由預(yù)設(shè)好的通用約束,比如以下幾種
PhysX 中的 Joints 例子
布料與流體模擬:
物體的變形與流動(dòng)
在游戲中,柔體、布料和流體的模擬用于呈現(xiàn)物體的形變和流動(dòng)行為,這些行為不僅遵循經(jīng)典物理定律,還依賴于數(shù)值計(jì)算方法來(lái)實(shí)現(xiàn)。通過(guò)這些模擬,游戲可以展示更加細(xì)膩、真實(shí)的物理效果,如人物在水中跑動(dòng)激起的漣漪、揮動(dòng)武器時(shí)帶動(dòng)附近草木的吹動(dòng)等現(xiàn)象。
柔體是指在外力作用下會(huì)發(fā)生形變的物體,相比于剛體,它們不再是完全不可變形的。柔體模擬的核心目標(biāo)是準(zhǔn)確描述物體在受到力時(shí)的變形行為。
柔體的形變與物理學(xué)中的應(yīng)力(Stress)和應(yīng)變(Strain)密切相關(guān)。應(yīng)力是描述外力作用下物體內(nèi)部力的分布,通常用應(yīng)力張量(Stress Tensor)表示。而應(yīng)變是描述物體因外力而發(fā)生的形狀或體積的變化。
應(yīng)力與應(yīng)變的關(guān)系:彈性體在應(yīng)力作用下會(huì)發(fā)生線性或非線性的應(yīng)變。最常用的模型是胡克定律(Hooke's Law),它描述了材料在小變形下的線性彈性行為:
質(zhì)點(diǎn)模型示意圖
質(zhì)點(diǎn)模型是最常用且計(jì)算簡(jiǎn)單柔體的方法之一。在這個(gè)模型中,物體被離散化為若干個(gè)質(zhì)點(diǎn),每個(gè)質(zhì)點(diǎn)通過(guò)彈簧相互連接,模擬材料的彈性行為。每個(gè)質(zhì)點(diǎn)的運(yùn)動(dòng)方程由牛頓第二定律給出。
Bullet 引擎展示的布料效果
對(duì)于更復(fù)雜的物體形變,我們可以使用有限元法。它通過(guò)將物體劃分為許多小的單元(如三角形或四面體),并通過(guò)求解每個(gè)單元的應(yīng)力和應(yīng)變來(lái)模擬物體的整體行為。這種方法通常用于模擬更精細(xì)的物體形變,能夠處理非線性和大變形。
流體模擬是物理引擎中最具挑戰(zhàn)性的任務(wù)之一,尤其是在真實(shí)感方面。流體行為受到連續(xù)介質(zhì)力學(xué)的深刻影響,特別是流體動(dòng)力學(xué)和熱力學(xué)。
流體的運(yùn)動(dòng)遵循納維-斯托克斯方程(Navier-Stokes Equations),這是描述粘性流體流動(dòng)的基礎(chǔ)方程:
方程左邊為慣性項(xiàng),描述了流體的動(dòng)量變化;右邊第一項(xiàng)是壓力項(xiàng),描述了由于壓力梯度產(chǎn)生的力,流體由高壓區(qū)向低壓區(qū)流動(dòng);第二項(xiàng)是黏性項(xiàng),描述了流體內(nèi)部的摩擦力(黏性)效應(yīng),這部分與流體的速度場(chǎng)的梯度有關(guān);第三項(xiàng)是體積黏性項(xiàng),這部分是為了考慮流體的體積黏性;最后一項(xiàng)是外力。
對(duì)于不可壓縮流體有:
進(jìn)而可以忽略體積黏性項(xiàng),在游戲中,我們甚至可以忽略黏性項(xiàng),并只考慮二維的情況,就得到一組很簡(jiǎn)化的方程,大大減小計(jì)算量:
但是得到的流體模擬相對(duì)簡(jiǎn)單,比如我們很難看到游戲中水面有著較遠(yuǎn)范圍的漣漪,相當(dāng)于把長(zhǎng)波長(zhǎng)部分的流體波動(dòng)忽略了。
黑神話中打斗時(shí)的水面波紋
游戲中和科研中對(duì)模擬的區(qū)別
無(wú)論是游戲開發(fā)還是科研領(lǐng)域,都需要模擬物體的運(yùn)動(dòng)和相互作用。然而,游戲中的剛體模擬和科研中的剛體模擬在目標(biāo)、精度、計(jì)算方法、約束和求解策略等方面有著明顯的不同。
游戲中的模擬主要側(cè)重于實(shí)時(shí)交互性和視覺(jué)真實(shí)感。游戲中的物體雖然按照牛頓力學(xué)的原理運(yùn)動(dòng),但模擬的精度和細(xì)節(jié)往往會(huì)有所簡(jiǎn)化,以便達(dá)到更好的用戶體驗(yàn)和更快的計(jì)算速度。模擬結(jié)果更多的是用于增強(qiáng)玩家的沉浸感,而不是精確的物理預(yù)測(cè)。
科研中的剛體模擬目標(biāo)通常是精確建模和性能評(píng)估,用于分析物體的力學(xué)行為、設(shè)計(jì)優(yōu)化或?qū)嶒?yàn)驗(yàn)證。模擬的目的是提供可靠的結(jié)果,用于實(shí)際應(yīng)用、理論研究或者驗(yàn)證物理現(xiàn)象。
游戲中的模擬與科研中的模擬雖然都基于相同的物理原理,但是游戲中的模擬通常會(huì)做很大程度的簡(jiǎn)化,以確保在每一幀中能夠高效地計(jì)算物體的運(yùn)動(dòng)。
不知道大家有沒(méi)有對(duì)游戲中的物理有了更深的理解呢,這里最后給大家一個(gè)黑神話中的游戲畫面,大家可以想想這之中又蘊(yùn)含多少物理模擬過(guò)程。
參考文獻(xiàn)
[1] Eberly, D. (2003). "Game Physics." Morgan Kaufmann.[2] Witkin, A. & Baraff, D. (2001). "Physically Based Modeling: Principles and Practice." SIGGRAPH Course Notes.[3] https://www.zhihu.com/question/277300055[4] https://developer.aliyun.com/article/432351
[5] https://zhuanlan.zhihu.com/p/679061686
策劃制作
來(lái)源丨中科院物理所(ID:cas-iop)
責(zé)編丨鐘艷平
審校丨徐來(lái) 林林