為什麼遊戲會有穿模bug?

如題。

萌新第一次發問誠惶誠恐。

最常見的比如說cf遁地穿箱之類的,而且某些遊戲在角色移動速度低時正常,移動速度過高會穿模呢?


物理上避免穿模的辦法是建立模型對應碰撞體做碰撞檢測。

離散碰撞檢測:每幀判斷每個碰撞體的每個面是否與其他碰撞體任何面有碰撞。

連續碰撞檢測:在上述基礎上,如果碰撞體在運動,還會做射線碰撞檢測預測這一幀內碰撞體將要進行的運動是否有碰撞。

一般認為碰撞檢測的複雜度是O(n^2)。這意味著場景內面數一旦增加,性能開銷會顯著提升。因此顯然不能用於每一個部件。

離散碰撞無法知曉這個物體在兩幀之內是否穿過了不該穿過的物體,尤其是兩幀里(由於高速)物體都沒和任何障礙物的碰撞體有重疊。射線法能避免高速下的穿模問題。但性能開銷更大。

還有一種穿模是人物模型與動作導致的穿模,比如衣服之間的穿透,尤其見於可換皮膚組件的遊戲中。這個情況下與其讓物理去花性能去判斷,不如讓美術規定好模型部件的動作範圍,從製作模型時就避免這一問題。


瀉藥。簡單科普一下,只討論一般情況。

1. 遊戲里避免穿插一般是靠碰撞檢測實現的。

2. 碰撞檢測不是連續的,而是一段時間檢測一次,比如每1/30秒一次。

3. 碰撞檢測的原理是判斷兩個碰撞體有沒有重疊的區域(進入彼此的空間),如果有,觸發碰撞事件,比如反彈或造成傷害等。

所以,當兩物體相對運動速度較小的時候發生碰撞,碰撞檢測會顯得比較精準及時;當相對速度較大時,檢測到碰撞的時候兩個碰撞體可能已經進入彼此比較多了,視覺上就會體現為模型穿插;如果相對速度大到了兩個碰撞體可以在兩次檢測間隔時間內穿過彼此,碰撞檢測就會認為沒有發生碰撞而不觸發事件。


謝邀

穿模原因很多啊,我看都在說物理,我補充點別的吧。

CF你看到別人穿模,遁地穿牆之類的,是因為網路。

聯機遊戲里,別人的位置並不是你的電腦來推進計算的,你的電腦只負責把角色顯示在伺服器下發的位置上。換句話說,別人的角色和場景是沒有碰撞的,服務端發下來的位置在哪兒,他就在哪兒。

由於網路條件的限制,這個位置是不連續的,每隔一段時間一個,你的客戶端會用差值演算法,模擬中間的過程。於是特殊的網路條件下,例如很卡或者掉線之類,你的客戶端可能就會看到其他玩家穿牆而過。WOW里經常有吧,掉線了的人義無反顧的一路狂奔衝進牆裡面,不見了。

也有可能是對方改動了本地的資源。亦或是別的什麼方式,讓自己的客戶端發給服務端的位置變得異常,例如在所有高度數值減少,於是別人看他就遁地了,在地下開槍。

對於FPS還有另一個原因,主角模型碰撞不精細。FPS遊戲,你自己只有一雙懸空的手,你和場景是沒有碰撞的。實際參與碰撞的是個代替人的碰撞體。這個碰撞體絕大部分遊戲里是個圓柱或者長方柱,完全沒有人的形狀。

因為人會做動作,所有這個盒子比真實的正常站立的模型大一圈,但是也不能大太多,大太多很多你本來可以正常通過的過道,你就過不去了。於是有些動作就不可避免的會超過這個範圍。

當你的盒子緊靠障礙物站著,做這些動作時,別人看到真實的模型的時候,就有可能穿模。例如撅著屁股蹲下之類的,或者因為長度太長,各種隔牆捅在外面的槍頭。

========回復下@ETO-lxw,比較有代表性我補充一下。

問:那麼玩家通過自己操作實現的穿模,cf(進箱子),飛車(遁地),守望屁股(出地圖),這些操作是怎麼觸發完全穿模的呢。有什麼共同條件嗎?就像這類玩家整個碰撞體穿透牆壁的情況,(,,?ω?,,)。

答:如果細心觀察的話,會發現很多遊戲都有個沿著碰撞滑動的狀態。蹭著牆,滑鼠不垂直牆面的時候會向兩邊滑動。這時候你的移動方向並不是你本來應該有的方向,這是個後處理,判斷你碰撞停下來後,又給了你一個滑動方向的速度。

而這時候你的碰撞體和場景碰撞完全貼在一起,當你擠的位置很特殊的時候,例如CF里一個箱子的夾角或者OW里地圖邊緣某些結構縫隙。你在不斷轉向移動的過程中,因為有多個方向的滑動合力,就有很小概率出現計算的偏差,導致你穿過碰撞體。


遊戲里的牆的機制一般是擋住角色行動(比如CF正常情況下你不能穿過箱子)

同時它還有一個特性:角色不能「卡」進去

就好像你不能站在箱子中間

這個特性是怎麼製作的呢

大多數遊戲採用了類似lol的處理辦法(不知道是誰最開始用的 但是lol用了而且比較知名)

那就是把牆分成兩塊

比如說你在牆左邊

這時你撞牆

系統會預判你接下來零點幾秒內的移動距離 如果小於0.5倍牆的厚度 你就不能通過 但如果大於0.5 那系統為了不讓你卡在牆裡 會把你彈到牆的另一邊

這可能就是所謂的穿牆?

知乎小透明,歡迎各位指正


請參考這個答案,應該是類似的問題

http://www.zhihu.com/question/55188559/answer/143610071


初學做遊戲的才發現遊戲的計算量有多大,而且大部分都是只能單線程的計算。很多東西只能用近似演算法就導致了各種奇奇怪怪的bug,如果每個步驟都用最精準的演算法那就算最nb的超級計算機也得報廢。 所以一般只要不是影響遊戲流程的也就隨他穿吧。


天下武功唯快不破啊!

速度太快了,來不及檢測啊!!


推薦閱讀:

來自一個清華學生的對於遊戲圈的迷茫?
為什麼沒人模仿小米模式做遊戲主機?
從2048這個遊戲中可以明白什麼樣人生道理?
遊戲主機進入中國市場後,國內的遊戲市場格局會發生變化么?
國內有 Gamergate 事件的消息嗎?

TAG:遊戲 | 遊戲開發 | 遊戲引擎 | 遊戲編程 |