策劃: 這塊石頭,玩家要能砍碎,而且要有猛然崩裂之感。
程式: 現實中,物體受到沖擊會碎成若幹小塊,在遊戲裏, 這種破碎效果是由物理引擎中的破碎系統實作的。
遊戲物理引擎會模擬物體(剛體 RigidBody)的撞擊,當撞擊發生時,物理引擎計算出撞擊的位置和沖量(作用在物體上的力在時間上的累積),將資訊交給破碎系統,破碎系統判定是否需要破碎,如何破碎,如果需要,就將剛體切割和分解成若幹合適的碎片,切割後由物理引擎繼續控制碎片,模擬碎片在真實世界的運動。
策劃: 具體講講,怎麽切割的。
程式: 嗯,在往下講之前,先給你科普一個遊戲開發小常識,你知道面麽?
策劃: 我知道啊。
程式: ……你可能不太知道,我給你科普一下。
遊戲中所有物體都是由面組成的,面越多,細節就越真實,但對效能的要求也越高, 因此遊戲開發者需要不斷平衡畫面表現和效能消耗,用最少的面實作最優質的效果 (這方面塞爾達傳說 曠野之息做得非常牛逼)
好,進入正題。破壞系統在切割碎片的過程中,需要計算碎片剛體的質素內容和形狀切割。
剛體質素內容即剛體的質素、轉動慣量和重心,為的是盡可能真實的模擬碎片運動;而形狀切割要保證碎片質素內容便於計算,且形狀大小豐富,接近真實破碎效果。
除了要切割剛體的形狀外,還要切割用於渲染的形狀,切割渲染形狀的面,可以在切割剛體的面上,增加一些細節,同時帶上紋理和uv座標,用於產生切割面的材質。
策劃: 一般什麽時候切割碎片?遊戲中即時生成麽?
程式: 嗯,切割碎片一般有2種方案。
一種是預切割,在資源制作的時候制作好帶貼圖的碎片,在遊戲執行時根據預先設定好的切割來分割。 此種方式在執行時比較節省運算量(視分割的碎片數和美術效果),但是無論玩家如何著力,分割的結果都是一樣的,和真實情況有很大差距。
另一種是在遊戲執行的時候做,即時生成符合當時條件的切割。 這種方法可以根據實際情況生成不同的碎片,比較接近真實世界的情況,但是運算量也非常大,容易引起遊戲的卡頓,非常依賴機器效能。
策劃: 在【我的世界】裏,破碎生成的圖形都是非常規則的,但真實世界中,破壞生成的碎片有大有小,邊緣並不規則,而且還有細節,這是怎麽生成的?
程式: 不錯,破碎系統僅做切割和凸分解的工作,物理引擎本身不會對破碎邊緣區做細碎的東西,最開始的破碎都是四邊形、六邊形等等,慢慢的添加一些細節。
這些細節,即不規則邊緣的視覺效果,主要是在Shader著色器裏去做,從渲染層面做出比較好的不規則效果。
對於即時大量破碎,就需要結合特效來做一些效果展示。比如一個很大的爆炸,基本上是破碎系統切割+特效,同時還要盡量減少切割,減少面數,否則依然會造成機器卡頓。
策劃: 舉個破碎系統的例子給我聽聽。
程式: 阿碧【彩虹六號:圍攻】玩過吧,R6的破壞系統很nb,遊戲中易碎材質(如木頭、玻璃等)所組成的表面都能破壞,包括墻壁、天花板和地板等等。這些材質除了使用炸藥也可以用槍擊或近戰攻擊破壞,若墻面遭到加固則需要特殊的炸藥方可擊破。
策劃: 這麽nb的破壞系統是怎麽做出來的呢?
程式: 請看R6物理程式設計師 @喝十八 的泣血陳述:
在R6裏你可以在很多墻的任意位置開洞來創造新的視線。你閑著蛋疼甚至可以用槍挖個狗洞爬出去。這是這個遊戲最大的創新。為了支持這種創新,開發團隊經歷的是徹徹底底的血淚史。 首先,我們討論的是把墻在任意位置打破這種事情。要做到這一點,靠預先把墻切成幾塊是不行的。因此,所有的墻體破壞都是根據破壞力大小即時計算的。而R6的設計目標是在PS4這種垃圾上PVP模式下要能跑60幀。 其次,拆墻顯然會影響到很多GAMEPLAY方面的事情。射擊,物理系統,人物移動,AI,NAVMESH都要根據破壞系統的結果做出反應,這又是一個CPU黑洞。 最後, R6是個競技向的聯網FPS遊戲,如何在各種網絡條件下正確地同步所有初始條件,從而保證所有的玩家都能看見相同的破壞效果,這又是一個天坑。 同時,因為反作弊的需求,你需要把破壞引擎放在伺服器上也執行一遍,導致R6非常非常非常燒伺服器。R6各種坑爹BUG跟這個多少都有點聯系,但是相比技術本身的復雜度和育碧願意在這個遊戲上投入的人力來說已經相當不錯了。策劃: 最後一個需求。這是一堵很厚的墻,玩家要能在墻上持續挖洞,最後……
程式: