物理引擎的取巧:為什麼遊戲裡的布永遠不會破
這個近似解的特性,決定了布料的行為風格:它會允許一點點拉伸、一點點穿透、一點點抖動,換取整體的穩定與便宜。而你看到的「布不會破」,其實只是這個近似策略的副產品。因為一個不追求精確的求解器,最安全的做法就是永遠不放棄任何一條約束。
二、不會破的第一個原因:約束求解天生「禁止」撕裂
我們已經知道布料是由頂點與約束組成的網。接下來要問的是:要讓它破,究竟需要做什麼?答案比你想的複雜得多,而這正是多數遊戲選擇不做的主要原因。
2.1 距離約束是把彈簧焊死
在一個標準的距離約束裡,兩個頂點之間的關係被定義為「距離應該等於某個靜止長度」。求解器每一步都會檢查這個距離,並在必要時修正。注意,這裡沒有「例外條款」。它不會因為距離超過靜止長度的兩倍就自動失效,也不會因為累積應變過大就減少約束的權重。除非程式設計師額外寫了一段判斷,否則這條約束就是永久有效的。
要實現撕裂,最基本的做法是為每條約束記錄應變量,當應變超過閾值時,把該約束標記為失效或直接從約束列表中移除。聽起來不難,但問題是:應變量的計算本身就有誤差,閾值調太低會導致布料莫名其妙地解體,調太高又幾乎不會觸發。更麻煩的是,移除約束之後,原本被連在一起的兩個頂點就自由了,但它們仍然共用同一套網格拓撲、同一套法線、同一套 UV 座標。要讓撕裂看起來合理,你還得處理頂點分裂、重新計算法線、更新碰撞形狀,甚至重新分配蒙皮權重。這些工作量和「讓布乖乖垂著」比起來,完全不成比例。
2.2 速度與位置修正:布料是「被拉回」的
另一個容易被忽略的點,是布料模擬的修正順序。在位置約束方法裡,求解器會先讓頂點自由飛,再把它們拉回約束允許的位置。這個「拉回」的動作,本質上是一種強制修正,而不是自然的斷裂。你可以想像一條橡皮筋的兩端被釘在牆上,中間掛了重物:真實的橡皮筋會斷,但在模擬裡,它只會被拉長到某個程度,然後被求解器硬生生扯住。
所以在視覺上,遊戲裡的布經常呈現出一種「有彈性但無限堅韌」的質感。它會伸、會皺、會抖,但就是不會破。這不是因為它模擬得很差,而是因為它的設計目標從頭到尾都是「維持連續性」。
2.3 自碰撞與穿透:用過濾器取代真實碰撞
除了約束之外,碰撞處理也是「禁止撕裂」的幫兇。真實的布料會與自己碰撞,產生複雜的褶皺與堆疊。但自碰撞的計算量非常大,所以遊戲通常會做兩件事:一是關閉大部分自碰撞,二是用一個「厚度」參數來假裝布料有體積。當布料穿過自己的時候,求解器只會把它推開一點點,而不會讓它撕裂。
同樣地,布料與角色的碰撞也常常被簡化。很多遊戲只讓布料與少數幾個膠囊體或球體碰撞,其餘的身體部位則直接忽略。這導致布料會穿進手臂、穿進大腿,但永遠不會因為「被身體撐破」而破裂。從工程角度來看,穿透是視覺問題,撕裂是結構問題;前者可以靠美術遮掩,後者卻會牽動整個系統。
三、效能預算:一條布在 16 毫秒裡只能做多少事
如果說約束求解是「不想破」的技術原因,那麼效能預算就是「不能破」的現實原因。遊戲是一個硬即時系統,每一幀只有大約 16.7 毫秒(以 60 FPS 計算)可以完成所有工作:渲染、動畫、AI、音效、網路同步、遊戲邏輯,全部都要塞進去。布料模擬通常只能分到其中很小的一塊。
3.1 頂點數與網格密度
影視特效裡的布料模擬,一件衣服動輒數十萬甚至上百萬個頂點,因為它可以花好幾個小時算一格畫面。遊戲完全不是這樣。主角身上的披風,可能只有幾百到幾千個頂點;路人 NPC 的衣服,可能幾十個頂點就打發;更遠的背景角色,干脆用頂點動畫或骨骼驅動,完全不做物理模擬。
頂點數越少,布料能表現的細節就越有限。你很難在一個只有三百個頂點的網格上,精確地模擬出「布料被刀刃劃開、纖維一根一根斷裂」的過程。因為那需要極高的解析度,而解析度就是成本。與其花大量資源去模擬一次性的撕裂,不如把資源拿去讓布料在奔跑時飄得好看一點,這是幾乎所有專案的共同選擇。
3.2 子步與迭代的取捨
除了頂點數,子步與迭代次數也是關鍵。子步指的是把一幀切成更小的時間片段來模擬,片段越小,數值越穩定;迭代次數則決定約束求解的精確度。兩者都會線性增加成本。一個常見的設定是:每幀兩到四個子步,每個子步四到八次迭代。這樣的配置足以讓布料看起來柔順,但遠遠不足以支撐「撕裂」這種需要高精度應變判斷的行為。
而且,布料模擬往往不是只算一件。主角的披風、裙擺、頭髮、旗幟、繩索、窗簾,全部都要算。當場景裡同時有十幾件布料在飄的時候,預算就會變得非常緊張。在這種情況下,任何額外的分支判斷、任何額外的資料結構維護,都會被工程師視為不必要的開銷。
3.3 LOD 與「遠景假布」
遊戲還有一個影視沒有的武器:細節層次(LOD)。當角色離鏡頭很遠的時候,布料模擬會自動降級 —— 頂點變少、迭代變少、甚至直接切換成預先烘焙好的頂點動畫。這意味著同一件披風,在近景可能是物理模擬,在中景是簡化模擬,在遠景則是一段循環播放的動畫。
在這種分層策略下,「撕裂」幾乎不可能被一致地實現。你很難要求一個遠景的頂點動畫突然回應玩家的攻擊,然後產生真實的破洞。所以最一致、最省事的做法,就是讓布料在所有層級下都保持完整。
四、美術與玩法的雙重保險:撕裂不是好設計
講完了技術,我們來談談設計。很多時候,布料不破不是因為做不到,而是因為「破了更麻煩」。
4.1 破壞帶來的穿幫與後續維護
撕裂是一種不可逆的狀態改變。一旦布料破了,它就沒辦法再像原本那樣被動畫驅動、被碰撞影響、被風吹動。它會變成一堆碎片,需要額外的物理模擬、額外的清理邏輯、額外的存檔處理。如果玩家在過場動畫裡看到自己的披風破了個洞,下一段動畫又要怎麼接?如果玩家重新讀檔,那個洞要保留嗎?如果同一件裝備在商店裡有破損版與完整版,美術要準備幾套材質?
這些問題看似瑣碎,卻會在專案後期累積成巨大的維護成本。相比之下,「布料永遠完整」是一個非常乾淨的狀態:它只有一種版本、一套邏輯、一種表現。對一個有數百件服裝、數十個角色、數十小時流程的遊戲來說,這種一致性本身就是價值。
4.2 布料不只是布料:它承擔了辨識度與表演
還有一個更微妙的理由:衣服是角色設計的一部分。披風的形狀、裙擺的長度、圍巾的飄動方式,都在傳達角色的性格與身份。一個破洞可能破壞剪影、影響辨識度,甚至在遠景時讓角色看起來像一團模糊的色塊。美術團隊花了大量時間調整布料的質感與輪廓,物理團隊卻讓它被一刀劃破,這在專案協作上是很難說服人的。
此外,布料也承擔表演功能。英雄落地時披風揚起、角色轉身時裙擺甩動、Boss 登場時斗篷翻飛,這些都是經過精心調整的視覺語言。如果布料會在戰鬥中隨機破裂,這些表演就會變得不穩定。遊戲不是模擬器,它是一場被設計過的體驗;而「穩定好看」通常比「真實可破壞」更重要。
4.3 分級破壞:用貼圖、粒子、預製件假裝撕裂
當然,遊戲並沒有完全放棄「布料受損」這個點子,只是用了更便宜的方式來實現。最常見的做法是分級破壞:第一級是材質切換,用貼圖或貼花(decal)在衣服上畫出破洞與血跡;第二級是粒子效果,在受擊點噴出布屑或煙塵;第三級是預製破損網格,事先做好「完好版」與「破損版」兩套模型,在特定事件時直接替換;第四級才是真正的拓撲撕裂,而這通常只出現在預算充足、且撕裂是核心玩法的作品裡。
這種分級策略的好處是可控。美術可以決定破洞長在哪裡、長什麼樣子;程式可以確保切換過程不會卡頓;設計師可以安排「什麼時候該破」。換句話說,遊戲用「假裝」取代了「模擬」,而這正是整個產業的常態。
五、引擎實作觀察:PhysX、Chaos、Havok 與 Unity Cloth
如果你打開主流引擎的布料設定面板,會發現一個很有趣的現象:參數很多,但幾乎沒有「斷裂」這個選項。這不是巧合,而是引擎設計者對市場需求的回應。
5.1 常見的「釘住」與「碰撞排除」旗標
在 PhysX、Havok、Unreal 的 Chaos Cloth、Unity 的 Cloth 元件裡,你通常會看到這些參數:勁度、阻尼、摩擦力、重力縮放、求解頻率、碰撞厚度、最大距離、虛擬粒子、以及「釘住」(pinning)或「附著」設定。釘住的意思是:把某些頂點固定在骨骼或靜態位置上,讓它們不參與模擬。這通常用在披風的肩扣、裙子的腰頭、旗幟的旗桿連接處。
這些參數的設計目的,都是讓布料「更聽話」:更不容易被拉長、更不容易穿透、更穩定地貼在角色身上。你幾乎看不到「應變閾值」或「斷裂模式」這種欄位。原因很簡單:對大多數使用者來說,布料模擬的痛點是「抖動」、「穿模」、「爆炸」,而不是「不夠容易破」。引擎廠商自然會優先解決前者。
5.2 為什麼布料總是黏在角色身上
另一個常見的觀察是:遊戲裡的布料好像特別「黏」。它會貼著大腿、貼著背部,甚至穿進身體之後又被拉回來。這其實是碰撞過濾與約束修正共同造成的。布料只與少數碰撞體互動,而且求解器會不斷把頂點推回約束允許的位置。結果就是一種「有彈性但甩不掉」的質感 —— 它不會破,也不會真正脫離身體,只會在你眼前抽搐幾下。
從技術角度看,這是一種取巧;從體驗角度看,這是一種必要的謊言。因為如果真的讓布料完全自由,它會立刻穿幫、纏繞、甚至把角色包成一團。與其追求真實,不如追求「大致上看起來沒問題」。
六、什麼情況下布真的會破?
說了這麼多,布當然不是絕對不會破。在某些作品裡,你確實會看到布料被撕裂、被燒毀、被扯成碎片。但這些案例幾乎都不是「物理引擎自然模擬」的結果,而是經過設計的例外。
6.1 腳本化撕裂與預切網格
最常見的做法是腳本化撕裂。設計師在特定事件發生時(例如角色被某個技能擊中、或血量低於某個閾值),觸發一段預先做好的動畫或切換到預先做好的破損模型。這種撕裂是確定的、可重複的、可控的,而且成本極低。玩家看到的「布被劃開」,其實是兩套網格在瞬間替換,中間可能還夾著粒子與音效來遮掩接縫。
更精細一點的做法是預切網格:美術事先把布料切成好幾片,並在切片邊緣設定斷點。當破壞發生時,引擎只需要把原本的「整片」換成「兩片或三片」,再讓這些碎片各自進行簡單的物理模擬。這種做法可以做出相當不錯的撕裂效果,但本質上仍然是「假撕裂」,因為斷裂的位置是事先決定好的,而不是物理計算出來的。
6.2 極端參數下的「物理爆炸」與視覺假象
還有一種情況,玩家會以為布料「破了」,但其實是數值失穩。當約束勁度過高、時間步長過大、或碰撞處理出現異常時,布料頂點可能會被彈飛到極遠的地方,視覺上就像整塊布被扯爆。這種現象在玩家社群裡常被稱為「物理爆炸」或「布料抽筋」,它與其說是撕裂,不如說是模擬失控。
真正的拓撲撕裂 —— 也就是約束斷開、頂點分裂、網格重新連接 —— 在商業遊戲裡非常少見,通常只出現在學術展示、技術 demo,或極少數把布料破壞當成核心賣點的作品中。即使有,也往往限制在特定物件上,而不是全面套用到所有角色服裝。
七、玩家可以怎麼看:辨識遊戲裡的布料取巧
理解了背後的原理,你下次玩遊戲時就可以用另一種眼光看那些飄動的布。以下是幾個常見的觀察點,也可以當成一種另類的「遊戲攻略」。
7.1 常見破綻清單
7.2 從布料看懂一款遊戲的技術取向
布料模擬的品質,往往能反映一個團隊的資源分配與技術取向。大型 3A 作品通常會投入較多資源在主角的布料上,使用較高解析度的網格、較多的迭代次數,甚至支援 GPU 模擬;獨立遊戲則傾向使用骨骼鏈、頂點動畫或簡單的彈簧系統,因為這些方案成本低、可控性高。競技類遊戲為了幀率穩定,往往會大幅簡化布料,甚至關閉部分模擬。
所以,當你看到一塊布「永遠不會破」的時候,不要急著說它假。更準確的說法是:這個團隊做了一個選擇,把資源放在他們認為更重要的地方。而那塊布,只是這個選擇的可見痕跡。
八、結語:不會破的布,是整個遊戲工業的縮影
回到最初的問題:為什麼遊戲裡的布永遠不會破?答案是層層疊疊的。數學上,約束求解的設計本來就傾向於維持連續性;效能上,撕裂所需的精度與維護成本遠超過多數專案的預算;設計上,破壞會帶來穿幫、維護與美術一致性的問題;引擎層面,主流工具根本沒有把「斷裂」當成預設功能。這四個原因互相加強,最終形成了我們看到的結果:一塊會飄、會皺、會穿模、會抽動,但就是不會破的布。
這其實是整個遊戲工業的縮影。遊戲不是試圖模擬真實世界,而是試圖在有限的時間與資源裡,模擬出一個「看起來夠真」的世界。布料不會破,不是因為工程師不懂物理,而是因為他們太懂取捨。他們知道玩家真正會注意到的是布料有沒有飄得好看、會不會穿進身體、會不會在關鍵時刻抽筋;至於它會不會破,多數時候根本不在玩家的觀察清單上。
所以,下次你看到角色的披風在爆炸中若無其事地垂下來,不妨笑一下。那不是 bug,那是一個經過計算的謊言,而整個遊戲工業,就是建立在無數個這樣的謊言之上。理解這些謊言,你就不會再被「物理引擎很爛」這種說法騙過去,而是能看見每個技術選擇背後的現實與妥協。