原文標(biāo)題:《給我一個物理引擎,我也能“預(yù)測”世界杯?》
世界杯正如火如荼地進(jìn)行,而大力神杯終究會花落誰家,成為了每屆世界杯都被人們津津樂道的話題。許多專業(yè)機(jī)構(gòu)也不甘落后,紛紛用自己的專業(yè)模型和數(shù)據(jù)進(jìn)行分析,給出了每支球隊奪冠的賠率。但你有沒有想過,不要 998,只要一個物理引擎,你也可以在家“預(yù)測”世界杯?
此預(yù)測非彼預(yù)測
看到這個小標(biāo)題,想必同學(xué)們應(yīng)該也猜到了,小編接下來為大家介紹的既不是像章魚保羅這樣的“神獸”式預(yù)測,也不是專業(yè)預(yù)測機(jī)構(gòu)那樣神秘的數(shù)據(jù)分析。接下來,小編將帶領(lǐng)同學(xué)們走入的是元宇宙紀(jì)元下交互版的世界杯預(yù)測世界??(其實就是帶大家一起玩實況啦~)
不知道還有多少同學(xué)知道這樣一句話呢:“歡迎來到實況足球 8,國際版的游戲世界”??實況 8,相信是整整一代人的足球游戲入坑作,想當(dāng)年小編也曾在其中打造自己的“夢之隊”,去馳騁世界賽場,斬獲一座座獎杯。
小編再來考一考,有多少同學(xué)知道拉普拉斯妖呢?這是一只準(zhǔn)確知道宇宙中所有原子的位置和動量,并能熟練使用牛頓定律的小妖,其可以通過力學(xué)定律精確地推演歷史,并預(yù)測未來。
讀到這里,相信同學(xué)們已經(jīng)能夠猜地八九不離十了:假如有這樣一個足球游戲,其能夠真實地還原每場比賽中的所有物理組成,包括場地、足球以及雙方球員的身體狀況、心態(tài)決策等等,那么我們就成為了這場比賽的“拉普拉斯妖”,并可以通過模擬這場比賽來對真實的比賽結(jié)果給出準(zhǔn)確的預(yù)測。
腦洞開的再大一點,我們甚至可以為比賽雙方都設(shè)置一個可以“進(jìn)化”的 AI,并讓他們之間不斷對戰(zhàn),通過電腦自己的“左右互搏”而自我進(jìn)化,從而篩選出一套最強(qiáng)的足球戰(zhàn)術(shù),從而反過來在現(xiàn)實中幫助球隊所向披靡。
且不論上述黑魔法是否真的能實現(xiàn),但不可否認(rèn)的是,現(xiàn)在的足球游戲真的是做的很逼真,不論是各種詭異的足球彈道到人物的表情服飾,都在游戲光影的渲染下與現(xiàn)實無異。然而,不知道同學(xué)們有沒有想過,電腦中的游戲為什么能如此栩栩如生地再現(xiàn)足球比賽,并且讓玩家可以感受到球員真實的技術(shù)動作以及反應(yīng)呢?下面,就讓小編帶領(lǐng)大家走進(jìn)作為足球游戲支撐的,背后的物理引擎世界吧~??
實況、FIFA,然后物理引擎
當(dāng)年小編玩的實況八,大致是這樣一種觀感:
可見,其人物造型仍有點“生疏”,而背后的草地也更像是一塊簡單的劣質(zhì)貼圖??。再來看看近幾年(以 FIFA22 為例)的游戲場景:
是不是既真實又炫酷呢?現(xiàn)在游戲之所以能夠帶來如此真實的體驗,離不開其背后的游戲引擎的支撐。
FIFA22 中使用的游戲引擎是大名鼎鼎的寒霜引擎:
而寒霜引擎中,作為其最基本物理部分引擎的,是 Havok 物理引擎 [1]:
其支持許多對于現(xiàn)實生活中物理現(xiàn)象的模擬,并通過不斷的技術(shù)迭代,使得人物的動作更加真實。
而其更是被應(yīng)用到了很多的 3A 大作中,例如:
而游戲引擎,顧名思義,猶如一款游戲的發(fā)動機(jī),是一個游戲的核心部件。游戲中例如足球的滾動、球員們的對抗與碰撞,都是基于其主管物理的部分:物理引擎而實現(xiàn)的。而在物理引擎的底層,其也蘊含著十足的硬核物理原理。同學(xué)們不妨跟著小編一起看下去,去踢一場“最硬核”的世界杯吧!??
物理引擎:剛體動力學(xué)、碰撞檢測與約束
一個成熟的物理引擎,其核心主要包括以下三大部分 [2]:
1.剛體動力學(xué)部分
2.碰撞檢測部分
3.約束部分
通過以上三個流程,物理引擎可以用如下圖所示的一個循環(huán)來迭代計算每個物體的位置和速度信息,當(dāng)?shù)俣茸銐蚩烨业Y(jié)果足夠精確時,顯示到屏幕上的物體運動就可以稱得上“栩栩如生”了。
物理引擎中的核心循環(huán),通過一系列符合物理法則的迭代計算更新物體的信息,從而使得游戲世界栩栩如生
下面,讓小編逐一為大家進(jìn)行介紹。
剛體動力學(xué)
首先,要讓計算機(jī)知道在游戲場景中,哪個地方存在一個什么樣的物體,它是如何運動的,我們需要找到一種合適的方式來對于物體的形狀、位置、速度等進(jìn)行描述。在建模過程中,一個復(fù)雜的物體經(jīng)??梢砸暈樵S許多多相對簡單的剛體的組合,作為 building blocks, 我們首先考察剛體動力學(xué)。
剛體 (rigid body),被定義為形變?yōu)?0 的物體,其上任意兩點之間的距離,無論剛體如何運動,都是不變的 [3]。在中學(xué)物理中,相信同學(xué)們都學(xué)習(xí)過質(zhì)點的運動學(xué),其由牛頓三定律描述 [4]:
牛頓三定律
從質(zhì)點運動學(xué)給我們的啟發(fā),在研究剛體運動學(xué)時,我們也嘗試借鑒描述質(zhì)點時的成功經(jīng)驗,并在其上進(jìn)行進(jìn)一步擴(kuò)充,以便正確描述一個有形狀有體積的剛體。鑒于剛體有著以一個整體運動的特征,我們可以首先定義其質(zhì)心:
質(zhì)心
其中,求和對應(yīng)于剛體質(zhì)量離散分布,而積分對應(yīng)連續(xù)質(zhì)量分布的剛體。
顧名思義,質(zhì)心就是剛體質(zhì)量的中心,凡是與剛體平動有關(guān)的動力學(xué)性質(zhì),都可以用質(zhì)心來代替。而質(zhì)心也有很多有趣的性質(zhì),例如下圖,如果一只玩具鳥的質(zhì)心正好被設(shè)計在嘴部,則人可以用一只手指將其托起而不至翻倒。
但與此同時,由于剛體可以視為一系列質(zhì)點的集合,其在空間存在一定的分布,所以如果僅僅使用質(zhì)心來描述其動力學(xué)特性是不夠的,我們還要研究剛體的轉(zhuǎn)動。
為了研究剛體的轉(zhuǎn)動,首先明確以下約定和記號 [6]:如下圖,假設(shè) XYZ 是我們進(jìn)行觀察的實驗室坐標(biāo)系(固定坐標(biāo)系),而 x1x2x3 為固定在剛體上并隨之一起平動、轉(zhuǎn)動的坐標(biāo)系(稱之為動坐標(biāo)系),圖中一些約定如下:
約定與記號
則剛體的任何一個無窮小位移:
可以表示為一個隨著其質(zhì)心的無窮小平動
以及一個繞著動坐標(biāo)系原點的無窮小轉(zhuǎn)動
之和:
剛體無窮小位移
這樣,剛體上任意一點的位置就可以被我們方便地描述了。下面,對上式逐項進(jìn)行求導(dǎo),來考察剛體上各點的速度:
其分別為剛體上某一點對于固定坐標(biāo)系的速度,剛體質(zhì)心的平動速度以及剛體的轉(zhuǎn)動角速度。由此可見,剛體上任意一點的速度可以用剛體平動速度和轉(zhuǎn)動角速度來分解:
下面研究剛體的受力與運動方程:首先,處理平動部分,并假設(shè)剛體的總質(zhì)量為
則有
進(jìn)一步,則有剛體平動的運動方程:
剛體平動的運動方程
這與質(zhì)點的運動方程是一致的,而這個結(jié)果也再次驗證了上文所說的,通過使用質(zhì)心來描述剛體平動的合理性。
為了描述轉(zhuǎn)動的運動方程,首先定義剛體的轉(zhuǎn)動慣量張量:
轉(zhuǎn)動慣量張量
上式對應(yīng)于離散情況,對連續(xù)質(zhì)量分布情況,只需要將各個分量用如下積分代替:
進(jìn)而,可以定義剛體的內(nèi)稟角動量
不妨選擇慣性參考系使得剛體質(zhì)心速度在該參考系中為 0(這一點總可以做到),并定義剛體的總力矩
則有剛體轉(zhuǎn)動部分的運動方程:
剛體轉(zhuǎn)動的運動方程
碰撞檢測
現(xiàn)在我們已經(jīng)知道如何描述一個剛體的位置以及運動了,但游戲場景中通常存在許許多多的物體,根據(jù)平時物理世界的直覺,如果兩個物體相向而行,則其必定會在某個時刻相撞而彈開。在物理引擎中,專門有碰撞檢測的算法來處理這一問題。
一般,對于物體的碰撞檢測分為兩個階段進(jìn)行,第一部分是較為粗糙的 Broad-Phase 部分,而第二部分是較為細(xì)致的 Narrow-Phase 部分。首先,看 Broad-Phase 檢測 [7]:
在 Broad-Phase 檢測中,就是先粗略地估計兩個物體有沒有可能相撞,來為之后的 Narrow-Phase 檢測減少工作量。首先,定義物體的 Bounding Volume[8]: 能完全包住該物體的最小長方體的體積。
最常用的 Bounding Volume 方法有 AABB(axis-aligned bounding boxes), OBB(oriented bounding boxes), 和 Bounding Circle/Sphere,其示意分別如下圖所示:
其中最常用,也是最節(jié)省計算資源的是第一種,為 AABB,在這一種 Bounding 方式下,判斷兩個物體是否可能發(fā)生碰撞,只需要檢測包圍住這兩個物體的長方體有沒有可能發(fā)生碰撞,從而將不規(guī)則物體碰撞的預(yù)檢測化為了規(guī)則的長方體之間重合的檢測。
在檢測是否有碰撞發(fā)生時,通常采用 Sweep and Prune 方法 [9],其大意如下:在 AABB 方法下,在每個坐標(biāo)軸上將每個物體所占有的長度的兩端標(biāo)記為 (b,e),如下圖,以 x 軸為例:
分別在坐標(biāo)軸上標(biāo)記了三個物體在 AABB 方法下的邊界,并產(chǎn)生了三個 (b,e) 對:
如此,對于任意兩個物體 i 和 j,如果判定下列不等式之一成立:
即判定這兩個物體有可能(即將或者已經(jīng)在)發(fā)生碰撞。
例如上面橫著的葡萄和足球,就滿足
這個不等式,而從圖中也可以看出,在 x 軸上,這兩個物體的投影也確實是有重合的。
在進(jìn)行完 Broad-Phase 檢測后,我們就挑選出了所有可能存在碰撞情況的物體對,并只需要對于這些物體對進(jìn)行更為細(xì)致的 Narrow-Phase 檢測,其簡介如下:
首先,考察一個物體的凹凸性,由于凸多面體有著更為方便的碰撞檢測特點,所以我們期望更多地使用凸多面體去近似實際的物理物體。
凸多面體可以被定義為,一個幾何體內(nèi)任意兩點所連線段都落在該幾何體內(nèi)的多面體。而凹多面體則反之,存在一條幾何體兩點連線,其不能完全包含在該幾何體內(nèi)。
可見,凸多面體存在著相較于凹多面體規(guī)則地多的形狀,這也是為什么凸多面體在實際計算中更好判斷是否發(fā)生碰撞的部分原因。但幸運的是,通過 Quickhull 算法 [10],我們可以方便地生成任意一個凹多面體的凸多面體逼近:
現(xiàn)在我們面對的問題就簡化成了如何細(xì)致判斷兩個凸多面體是否發(fā)生碰撞。一種直觀的想法是逐點判斷兩個物體的輪廓,是否有存在一個多邊形的某個點被另一個多邊形的所有邊界點所包圍。但在實際物理引擎中,通常使用更為優(yōu)化的計算方法,以平衡計算開支。其中一種較為方便的方法稱為 Separating Axis Theorem(SAT),其基本原理是 [11]:對于兩個凸多面體,其不相交的條件是存在一條直線,使得兩者在該直線上的投影不相交。
例如,上圖六邊形與梯形,存在一條投影軸 (Axis) 使得兩者在其上的投影不相交,則判定這兩個物體沒有發(fā)生碰撞,這也與直接的直觀認(rèn)知是一致的。
現(xiàn)在我們知道了如何判定兩個物體有沒有碰撞,那么,假如兩個物體發(fā)生了碰撞,其碰撞之后的情況又是什么樣的呢?下面以質(zhì)點碰撞為例,說明物理引擎對于碰撞的處理。
碰撞可以分為彈性碰撞與非彈性碰撞(包含完全非彈性碰撞和部分彈性碰撞),首先,看彈性碰撞,對于兩個理想球體發(fā)生彈性碰撞,其過程中動量和能量都守恒,設(shè)其質(zhì)量分別為 m1 和 m2,初始速度分別為 u1 和 u2,碰撞后速度為 v1 和 v2,則有 [12]:
對于非彈性碰撞,定義恢復(fù)系數(shù)
恢復(fù)系數(shù)
則有碰撞后速度:
可以看出,恢復(fù)系數(shù)為 0 對應(yīng)完全非彈性碰撞,而其為 1 對應(yīng)為完全彈性碰撞。恢復(fù)系數(shù)通常與兩個碰撞物體的材質(zhì)以及物理特性有關(guān),是一個經(jīng)驗的參數(shù),需要對兩兩物體間分別設(shè)定。
看到這里,兩個物體在物理引擎中是如何判定是否發(fā)生碰撞的,以及如果其發(fā)生了碰撞后如何繼續(xù)演化就被我們以至少一種可行的方式弄清楚了。但僅僅知道上述內(nèi)容還不足以完成一個完整的物理引擎,這是因為在實際的物理世界中,處處都存在著約束條件 [15],例如一個小物塊從斜坡上滑下,其在運動過程中必須保持自身處于斜面之上,而不能突然穿入斜面或者飛到天上去。
下面就讓我們一起來看看,物理引擎中所用到的約束吧。
約束
從上文的討論可知,約束通常意味著真實的物理情形對于物體位置和速度的限制,使之不會出現(xiàn)反常、反直覺的現(xiàn)象(例如游戲中偶爾出現(xiàn)的穿模 bug,就是約束沒算好??)
那么,在物理引擎中,約束是如何進(jìn)行計算的呢?下面用一個簡單的例子進(jìn)行說明:
例如,對于一個在碗里的小球,我們把小球從碗的邊緣釋放,使之在碗中自由運動。
把碗的內(nèi)壁簡化為一個半球面,并不妨設(shè)其半徑為 R,并把小球簡化成質(zhì)點的話,則不難得到如下的約束:
其含義是小球到上圖坐標(biāo)系原點 O 的距離始終是碗的半徑,也就對應(yīng)著小球被約束在碗壁上這一物理實在。
下面,將上述約束寫為更形式化的形式:
其中,C (r) 被稱為約束方程,其等價于上面的約束條件。將該約束方程與最開始部分的運動學(xué)方程聯(lián)立,即得到了對于物體的準(zhǔn)確描述。而在物理引擎求解約束這一部分,則相應(yīng)的需要對在計算過程中出現(xiàn)的違反約束的位形進(jìn)行修正,通常采用人為引入一個約束力的方式進(jìn)行,以保證最后不出現(xiàn)不合常理的游戲情形。(媽媽再也不用擔(dān)心我的穿模啦??)
最后...
相信通過上文的學(xué)習(xí),同學(xué)們一定已經(jīng)對物理引擎有了一個較為基礎(chǔ)的了解了??,不過當(dāng)然,就像鳥兒飛翔不需要懂空氣動力學(xué)一樣,同學(xué)們不必知道游戲引擎的每一個原理也可以暢玩游戲,但作為當(dāng)今世界傳播最廣的娛樂方式之一,游戲,其核心:游戲引擎,尤其是物理引擎,卻大量應(yīng)用了最基本的物理原理。正是由于物理定律對于真實世界的精確描述,人們才得以在計算機(jī)構(gòu)建的世界中搭建一個栩栩如生的舞臺,在其上有列國紛爭、異世冒險、激情賽道、鷹擊長空、實況足球等等等等,但小編也希望同學(xué)們在看完這篇科普后,也能在以后再次打開實況八的時候,或多或少地想到,作為游戲核心支撐的物理定律,其強(qiáng)大的威力以及其無盡的魅力。而至于開頭說的拉普拉斯妖式預(yù)測可能還有很長的路要走,但左右互搏術(shù)的思想已經(jīng)被用于多種情景中,例如大名鼎鼎的 Alpha Go Zero。
最后,希望同學(xué)們既能夠享受游戲,也能夠享受本屆世界杯的無窮魅力,就像 1998 年法國世界杯主題曲所唱一樣,"Here we go, 啊嘞啊嘞啊嘞,GOGOGO,啊嘞啊嘞啊嘞 "??
參考資料:
向上滑動閱覽
[1]: 寒霜引擎_百度百科 (baidu.com)
[2]: Video Game Physics Tutorial | Toptal
[3]: Rigid body - Wikipedia
[4]: 牛頓運動定律(物理定律)_百度百科 (baidu.com)
[5]: Center of mass - Wikipedia
[6]: 朗道理論物理教程 (卷 01),《力學(xué)》(第 5 版),[俄] 朗道、栗弗席茲,李俊峰、鞠國興 (譯),高等教育出版社,2007
[7]:Chapter 32. Broad-Phase Collision Detection with CUDA | NVIDIA Developer
[8]: Bounding volume - Wikipedia
[9]: Sweep and prune - Wikipedia
[10]: Quickhull - Wikipedia
[11]: Hyperplane separation theorem - Wikipedia
[12]:Elastic collision - Wikipedia
[13]: Coefficient of restitution - Wikipedia
[14]: Inelastic collision - Wikipedia
[15]: Constraint (classical mechanics) - Wikipedia
本文來自微信公眾號:中科院物理所 (ID:cas-iop),作者:Callo
廣告聲明:文內(nèi)含有的對外跳轉(zhuǎn)鏈接(包括不限于超鏈接、二維碼、口令等形式),用于傳遞更多信息,節(jié)省甄選時間,結(jié)果僅供參考,IT之家所有文章均包含本聲明。