選單

給我一個物理引擎,我也能“預測”世界盃?

世界盃正如火如荼地進行,而大力神杯終究會花落誰家,成為了每屆世界盃都被人們津津樂道的話題。許多專業機構也不甘落後,紛紛用自己的專業模型和資料進行分析,給出了每支球隊奪冠的賠率。但你有沒有想過,不要998,

只要一個物理引擎,你也可以在家“預測”世界盃?

給我一個物理引擎,我也能“預測”世界盃?

大力神杯 | 圖源 FIFA World Cup Trophy - Wallpapers Den

此預測非彼預測

看到這個小標題,想必同學們應該也猜到了,小編接下來為大家介紹的既不是像章魚保羅這樣的“神獸”式預測,也不是專業預測機構那樣神秘的資料分析。接下來,小編將帶領同學們走入的是

元宇宙紀元下

互動版的世界盃預測世界(其實就是帶大家一起玩實況啦~)

給我一個物理引擎,我也能“預測”世界盃?

章魚保羅 | 圖源 www。wbur。org

不知道還有多少同學知道這樣一句話呢:“

歡迎來到實況足球8,國際版的遊戲世界

”實況8,相信是整整一代人的足球遊戲入坑作,想當年小編也曾在其中打造自己的“夢之隊”,去馳騁世界賽場,斬獲一座座獎盃。

給我一個物理引擎,我也能“預測”世界盃?

歡迎來到實況足球8國際版的遊戲世界 | 圖源 實況足球8國際中文解說版

小編再來考一考,有多少同學知道

拉普拉斯妖

呢?這是一隻準確知道宇宙中所有原子的位置和動量,並能熟練使用牛頓定律的小妖,其可以透過力學定律精確地推演歷史,並預測未來。

給我一個物理引擎,我也能“預測”世界盃?

Démon de Laplace | 圖源 www。etsy。com

讀到這裡,相信同學們已經能夠猜地八九不離十了:假如有這樣一個足球遊戲,其能夠真實地還原每場比賽中的所有物理組成,包括場地、足球以及雙方球員的身體狀況、心態決策等等,那麼我們就成為了這場比賽的“拉普拉斯妖”,並可以透過模擬這場比賽來對真實的比賽結果給出準確的預測。

腦洞開的再大一點,我們甚至可以為比賽雙方都設定一個可以“進化”的AI,並讓他們之間不斷對戰,透過電腦自己的“左右互搏”而自我進化,從而篩選出一套最強的足球戰術,從而反過來在現實中幫助球隊所向披靡。

給我一個物理引擎,我也能“預測”世界盃?

左右互搏 | 圖源 手機搜狐網 (sohu。com)

且不論上述黑魔法是否真的能實現,但不可否認的是,現在的足球遊戲真的是做的很逼真,不論是各種詭異的足球彈道到人物的表情服飾,都在遊戲光影的渲染下與現實無異。然而,不知道同學們有沒有想過,電腦中的遊戲為什麼能如此栩栩如生地再現足球比賽,並且讓玩家可以感受到球員真實的技術動作以及反應呢?下面,就讓小編帶領大家走進作為足球遊戲支撐的,背後的

物理引擎

世界吧~

實況、FIFA,然後物理引擎

當年小編玩的實況八,大致是這樣一種觀感:

給我一個物理引擎,我也能“預測”世界盃?

實況八中的齊祖 | 圖源 malavida。com

可見,其人物造型仍有點

“生疏”

,而背後的草地也更像是一塊簡單的劣質貼圖。再來看看近幾年(以FIFA22為例)的遊戲場景:

給我一個物理引擎,我也能“預測”世界盃?

FIFA 22 | 圖源 EA SPORTS

是不是

既真實又炫酷

呢?現在遊戲之所以能夠帶來如此真實的體驗,離不開其背後的

遊戲引擎

的支撐。

FIFA22中使用的遊戲引擎是大名鼎鼎的

寒霜引擎

給我一個物理引擎,我也能“預測”世界盃?

寒霜引擎 | 圖源 USgamer

而寒霜引擎中,作為其最基本物理部分引擎的,是

Havok物理引擎

[1]:

給我一個物理引擎,我也能“預測”世界盃?

Havok引擎 | 圖源  Attack of the Fanboy

其支援許多對於現實生活中物理現象的模擬,並透過不斷的技術迭代,使得人物的動作更加真實。

給我一個物理引擎,我也能“預測”世界盃?

Havok引擎演示 | 圖源 【遊戲研究室】嗶哩嗶哩

而其更是被應用到了很多的3A大作中,例如:

給我一個物理引擎,我也能“預測”世界盃?

一些應用了Havok引擎的遊戲,你能認出幾個?| 圖源 Havok

遊戲引擎

,顧名思義,猶如一款遊戲的發動機,是一個遊戲的核心部件。遊戲中例如足球的滾動、球員們的對抗與碰撞,都是基於其主管物理的部分:

物理引擎

而實現的。而在物理引擎的底層,其也蘊含著

十足的硬核物理原理

。同學們不妨跟著小編一起看下去,去

踢一場“最硬核”的世界盃吧!

物理引擎:剛體動力學、碰撞檢測與約束

一個成熟的物理引擎,其核心主要包括

以下三大部分

[2]:

1.剛體動力學部分

2.碰撞檢測部分

3.約束部分

透過以上三個流程,物理引擎可以用如下圖所示的一個迴圈來

迭代計算

每個物體的位置和速度資訊,當迭代速度足夠快且迭代結果足夠精確時,顯示到螢幕上的物體運動就可以稱得上“栩栩如生”了。

給我一個物理引擎,我也能“預測”世界盃?

物理引擎中的核心迴圈,透過一系列符合物理法則的迭代計算更新物體的資訊,從而使得遊戲世界栩栩如生

下面,讓小編逐一為大家進行介紹。

剛體動力學

首先,要讓計算機知道在遊戲場景中,哪個地方存在一個什麼樣的物體,它是如何運動的,我們需要找到一種合適的方式來對於物體的

形狀、位置、速度等

進行描述。在建模過程中,一個複雜的物體經常可以視為許許多多相對簡單的剛體的組合,作為building blocks,我們首先考察

剛體動力學

給我一個物理引擎,我也能“預測”世界盃?

一個典型剛體 | 圖源[3]

剛體(rigid body)

,被定義為形變為0的物體,

其上任意兩點之間的距離,無論剛體如何運動,都是不變的

[3]。在中學物理中,相信同學們都學習過質點的運動學,其由

牛頓三定律

描述[4]:

牛頓三定律

給我一個物理引擎,我也能“預測”世界盃?

從質點運動學給我們的啟發,在

研究剛體運動學

時,我們也嘗試借鑑描述質點時的成功經驗,並在其上進行進一步擴充,以便正確描述一個有形狀有體積的剛體。鑑於剛體有著以一個整體運動的特徵,我們可以首先定義其

質心

質心

給我一個物理引擎,我也能“預測”世界盃?

其中,求和對應於剛體質量離散分佈,而積分對應連續質量分佈的剛體。

顧名思義,質心就是剛體質量的中心,凡是與

剛體平動

有關的動力學性質,都可以用質心來代替。而質心也有很多有趣的性質,例如下圖,如果一隻玩具鳥的質心正好被設計在嘴部,則人可以用一隻手指將其托起而不至翻倒。

給我一個物理引擎,我也能“預測”世界盃?

利用質心特性製作的小玩具 | 圖源 [5]

但與此同時,由於剛體可以視為一系列質點的集合,其

在空間存在一定的分佈

,所以如果僅僅使用質心來描述其動力學特性是不夠的,我們還要研究

剛體的轉動

為了研究剛體的轉動,首先明確以下約定和記號[6]:如下圖,假設XYZ是我們進行觀察的實驗室座標系(

固定座標系

),而x1x2x3為固定在剛體上並隨之一起平動、轉動的座標系(稱之為

動座標系

),圖中一些約定如下:

給我一個物理引擎,我也能“預測”世界盃?

約定與記號

給我一個物理引擎,我也能“預測”世界盃?

則剛體的任何一個無窮小位移:

給我一個物理引擎,我也能“預測”世界盃?

可以表示為一個隨著其質心的無窮小平動

給我一個物理引擎,我也能“預測”世界盃?

以及一個繞著動座標系原點的無窮小轉動

給我一個物理引擎,我也能“預測”世界盃?

之和:

剛體無窮小位移

給我一個物理引擎,我也能“預測”世界盃?

這樣,剛體上任意一點的位置就可以被我們方便地描述了。下面,對上式逐項進行求導,來考察剛體上各點的速度:

給我一個物理引擎,我也能“預測”世界盃?

其分別為剛體上某一點對於固定座標系的速度,剛體質心的平動速度以及剛體的轉動角速度。由此可見,

剛體上任意一點的速度可以用剛體平動速度和轉動角速度來分解

給我一個物理引擎,我也能“預測”世界盃?

下面研究剛體的受力與運動方程:首先,處理平動部分,並假設剛體的總質量為

給我一個物理引擎,我也能“預測”世界盃?

則有

給我一個物理引擎,我也能“預測”世界盃?

進一步,則有剛體平動的運動方程:

剛體平動的運動方程

給我一個物理引擎,我也能“預測”世界盃?

這與質點的運動方程是一致的,而這個結果也再次驗證了上文所說的,透過使用質心來描述剛體平動的合理性。

為了描述

轉動的運動方程

,首先定義剛體的

轉動慣量張量

轉動慣量張量

給我一個物理引擎,我也能“預測”世界盃?

上式對應於離散情況,對連續質量分佈情況,只需要將各個分量用如下積分代替:

給我一個物理引擎,我也能“預測”世界盃?

進而,可以定義剛體的

內稟角動量

給我一個物理引擎,我也能“預測”世界盃?

不妨選擇慣性參考系使得剛體質心速度在該參考系中為0(這一點總可以做到),並定義剛體的

總力矩

給我一個物理引擎,我也能“預測”世界盃?

則有剛體

轉動部分的運動方程

剛體轉動的運動方程

給我一個物理引擎,我也能“預測”世界盃?

碰撞檢測

現在我們已經知道如何描述一個剛體的位置以及運動了,但遊戲場景中通常存在許許多多的物體,根據平時物理世界的直覺,如果兩個物體相向而行,則其必定會在某個時刻相撞而彈開。在物理引擎中,專門有

碰撞檢測

的演算法來處理這一問題。

一般,

對於物體的碰撞檢測分為兩個階段進行

,第一部分是較為粗糙的

Broad-Phase

部分,而第二部分是較為細緻的

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

,其示意分別如下圖所示:

給我一個物理引擎,我也能“預測”世界盃?

三種常用的Bounding

其中最常用,也是最節省計算資源的是第一種,為

AABB

,在這一種Bounding方式下,判斷兩個物體是否可能發生碰撞

,只需要檢測包圍住這兩個物體的長方體有沒有可能發生碰撞,從而將不規則物體碰撞的預檢測化為了規則的長方體之間重合的檢測。

在檢測是否有碰撞發生時,通常採用

Sweep and Prune

方法[9],其大意如下:在AABB方法下,在每個座標軸上將每個物體所佔有的長度的兩端標記為(b,e),如下圖,以x軸為例:

給我一個物理引擎,我也能“預測”世界盃?

Sweep and Prune方法

分別在座標軸上標記了三個物體在AABB方法下的邊界,併產生了三個

(b,e)對:

給我一個物理引擎,我也能“預測”世界盃?

如此,對於任意兩個物體i和j,

如果判定下列不等式之一成立

給我一個物理引擎,我也能“預測”世界盃?

即判定這兩個物體有可能(即將或者已經在)發生碰撞

例如上面橫著的葡萄和足球,就滿足

給我一個物理引擎,我也能“預測”世界盃?

這個不等式,而從圖中也可以看出,在x軸上,這兩個物體的投影也確實是有重合的。

在進行完Broad-Phase檢測後,我們就挑選出了所有可能存在碰撞情況的物體對,並只需要對於這些物體對進行更為細緻的

Narrow-Phase

檢測,其簡介如下:

首先,考察一個物體的凹凸性,由於凸多面體有著更為方便的碰撞檢測特點,所以我們期望更多地使用凸多面體去近似實際的物理物體。

凸多面體

可以被定義為,

一個幾何體內任意兩點所連線段都落在該幾何體內的多面體

。而凹多面體則反之,存在一條几何體兩點連線,其不能完全包含在該幾何體內。

給我一個物理引擎,我也能“預測”世界盃?

凸多面體與凹多面體

可見,凸多面體存在著相較於凹多面體規則地多的形狀,這也是為什麼凸多面體在實際計算中更好判斷是否發生碰撞的部分原因。但幸運的是,透過

Quickhull

演算法[10],我們可以方便地生成任意一個凹多面體的凸多面體逼近:

給我一個物理引擎,我也能“預測”世界盃?

Quickhull演算法示意 | 圖源 [10]

現在我們面對的問題就簡化成了如何細緻判斷兩個凸多面體是否發生碰撞。一種直觀的想法是逐點判斷兩個物體的輪廓,是否有存在一個多邊形的某個點被另一個多邊形的所有邊界點所包圍。但在實際物理引擎中,通常使用更為最佳化的計算方法,以平衡計算開支。其中一種較為方便的方法稱為

Separating Axis Theorem

(SAT),其基本原理是[11]:

對於兩個凸多面體,其不相交的條件是存在一條直線,使得兩者在該直線上的投影不相交

給我一個物理引擎,我也能“預測”世界盃?

SAT演算法示意

例如,上圖六邊形與梯形,存在一條投影軸(Axis)使得兩者在其上的投影不相交,則判定這兩個物體沒有發生碰撞,這也與直接的直觀認知是一致的。

現在我們知道了如何判定兩個物體有沒有碰撞,那麼,假如兩個物體發生了碰撞,其

碰撞之後

的情況又是什麼樣的呢?下面以質點碰撞為例,說明物理引擎對於碰撞的處理。

碰撞可以分為

彈性碰撞

非彈性碰撞

(包含完全非彈性碰撞和部分彈性碰撞),首先,看

彈性碰撞

,對於兩個理想球體發生彈性碰撞,其過程中動量和能量都守恆,設其質量分別為m1和m2,初始速度分別為u1和u2,碰撞後速度為v1和v2,則有[12]:

給我一個物理引擎,我也能“預測”世界盃?

對於

非彈性碰撞

,定義

恢復係數

恢復係數

給我一個物理引擎,我也能“預測”世界盃?

則有碰撞後速度:

給我一個物理引擎,我也能“預測”世界盃?

可以看出,恢復係數為0對應完全非彈性碰撞,而其為1對應為完全彈性碰撞。

恢復係數通常與兩個碰撞物體的材質以及物理特性有關

,是一個經驗的引數,需要對兩兩物體間分別設定。

看到這裡,兩個物體在物理引擎中是如何判定是否發生碰撞的,以及如果其發生了碰撞後如何繼續演化就被我們以至少一種可行的方式弄清楚了。但僅僅知道上述內容還不足以完成一個完整的物理引擎,這是因為在實際的物理世界中,處處都存在著

約束條件

[15],例如一個小物塊從斜坡上滑下,其在運動過程中必須保持自身處於斜面之上,而不能突然穿入斜面或者飛到天上去。

給我一個物理引擎,我也能“預測”世界盃?

斜面上的小物塊、受力分析和約束 | 圖源 [15]

下面就讓我們一起來看看,物理引擎中所用到的約束吧。

約束

從上文的討論可知,約束通常意味著真實的物理情形對於物體位置和速度的限制,使之不會出現反常、反直覺的現象()

給我一個物理引擎,我也能“預測”世界盃?

一個約束計算失敗案例 | 圖源 baidu。com

那麼,

在物理引擎中,約束是如何進行計算的呢?

下面用一個簡單的例子進行說明:

例如,對於一個在碗裡的小球,我們把小球從碗的邊緣釋放,使之在碗中自由運動。

給我一個物理引擎,我也能“預測”世界盃?

快到碗裡來

把碗的內壁簡化為一個半球面,並不妨設其半徑為R,並把小球簡化成質點的話,則不難得到如下的約束:

給我一個物理引擎,我也能“預測”世界盃?

其含義是小球到上圖座標系原點O的距離始終是碗的半徑,也就對應著小球被約束在碗壁上這一物理實在。

下面,將上述約束寫為更形式化的形式:

給我一個物理引擎,我也能“預測”世界盃?

其中,C(r)被稱為

約束方程

,其等價於上面的約束條件。將該約束方程與最開始部分的運動學方程聯立,即得到了對於物體的準確描述。而在物理引擎求解約束這一部分,則相應的需要對在計算過程中出現的違反約束的位形進行修正,通常採用人為引入一個約束力的方式進行,以保證最後不出現不合常理的遊戲情形。(媽媽再也不用擔心我的穿模啦)

最後...

相信透過上文的學習,同學們一定已經對物理引擎有了一個較為基礎的瞭解了,不過當然,就像鳥兒飛翔不需要懂空氣動力學一樣,同學們不必知道遊戲引擎的每一個原理也可以暢玩遊戲,但作為當今世界傳播最廣的娛樂方式之一,遊戲,其核心:遊戲引擎,尤其是物理引擎,卻大量應用了最基本的物理原理。正是由於物理定律對於真實世界的精確描述,人們才得以在計算機構建的世界中搭建一個栩栩如生的舞臺,在其上有列國紛爭、異世冒險、激情賽道、鷹擊長空、實況足球等等等等,但小編也希望同學們在看完這篇科普後,也能在以後再次開啟實況八的時候,或多或少地想到,作為遊戲核心支撐的物理定律,其強大的威力以及其無盡的魅力。而至於開頭說的拉普拉斯妖式預測可能還有很長的路要走,但左右互搏術的思想已經被用於多種情景中,例如大名鼎鼎的Alpha Go Zero。

最後,希望同學們既能夠享受遊戲,也能夠享受本屆世界盃的無窮魅力,就像1998年法國世界盃主題曲所唱一樣,“

Here we go,啊嘞啊嘞啊嘞, GOGOGO,啊嘞啊嘞啊嘞

~END~

參考資料:

向上滑動閱覽

[1]: 寒霜引擎_百度百科 (baidu。com)

[2]: Video Game Physics Tutorial  | Toptal

[3]: Rigid body - Wikipedia

[4]: 牛頓運動定律(物理定律)_百度百科 (baidu。com)

[5]: Center of mass - Wikipedia

[6]: 朗道理論物理教程(卷01),《力學》(第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

編輯:Callo