但是妳知道遊戲裏的子彈是怎麽飛的嗎?
早期和現實世界中的子彈完全不同,很多玩家合理利用了這個bug,比如CS中的狙擊。
隨著PC計算能力的提升,子彈算法也在進步,彈道效果越來越真實。
最近軟件工程師Tristan Jung在遊戲論壇總結了壹些FPS遊戲的子彈軌跡算法。讓我們來看看FPS遊戲在過去的20年裏發生了哪些變化。
早期的FPS遊戲使用了壹種“光線投射”的技術,利用槍口發出的光線來決定子彈的軌跡。光線投射可以確定與光線相交的第壹個對象。
在FPS中,這種算法被稱為“hitscan”。當妳扣動扳機的時候,物理引擎會計算以下事情:
如果引擎發現有物體擋住了子彈的路徑,它會通知系統該物體已被擊中。
hitscan的核心很簡單。至於物體被子彈擊中後接下來的邏輯是什麽,可以根據遊戲的要求來定義:
1.如果讓子彈穿透,它會穿透路線上的所有物體;
2.通過消除最大射線範圍,可以壹直發射激光,直到擊中物體;
3.將壹些表面設置為反射性的,這樣子彈就可以被彈開。
使用hitscan算法最大的優點是計算簡單快速,不需要額外的內存和處理時間就可以構建新的物理對象。這也意味著在多人遊戲中,所需的網絡資源也是最少的。
所以業內很多遊戲使用hitscan作為射擊算法也就不足為奇了。
不僅有德國總部3D、末日等經典遊戲,也有壹些近年來的熱門遊戲。比如《守望先鋒》和《使命召喚》中的壹些武器就使用了hitscan算法。
然而,hitscan仍然存在壹些缺陷。
首先,子彈的速度是無限的,比光速還快,瞬間到達被擊中的物體。即使妳離目標很遠,只要射擊的壹瞬間對手在瞄準鏡上,妳就死定了。
其次,子彈的路徑是壹條直線,不考慮風向、重力等因素。即使建模時將路徑改為曲線,子彈射出後也無法改變路徑。
為了讓射擊遊戲更加真實,我們需要使用另壹種方法。
這個算法聽起來很花哨,但其實很簡單。
武器發射的每壹顆子彈都會在環境中創建壹個新的物理對象,它自己的質量、速度和命中框都要由引擎來計算。
因為每個拋射體都是獨立存在的,所以可以考慮風、摩擦力、重力、溫度等因素。任何作用在子彈上的力都會改變它的方向。
而且在這種算法下,子彈不會瞬間移動,可以實現以下功能:
1,部分遊戲有“子彈時間”特效;
2.如果是遠距離攻擊移動目標,需要事先估計目標的移動量;
3、實現手榴彈等爆炸物的延時爆炸。
但在玩多人遊戲時,服務器會需要做更多的計算,以確保所有對象同步,並且必須解決不同嘉賓玩家之間的差異或沖突,以避免給同壹服務器上的玩家帶來不壹致的體驗。
壹種方法是在遊戲時間之前加載“池”對象,並在需要時“彎曲並啟用”它們。壹旦撞擊到物體表面,它就會被回收並儲存起來以備後用。
這種方法將減少重復創建和銷毀對象的計算和內存開銷。
至於遊戲時間的同步,有很多種計算方法:
1.時間是與渲染分開計算的。即使有跳幀,遊戲也能準確的表現物體。該方法需要計算自上次渲染以來的確切時間。
2.計算每壹幀的時間,將物理引擎綁定到幀率。如果您禁用幀速率上限,或者開始丟幀,您將會看到加速或堵塞的效果。
而且,當子彈速度足夠快時,這種算法可能會遇到物體“互相穿透”的情況,雖然它們在引擎中從不重疊。
有什麽辦法可以把以上兩種方法的優點結合起來?答案是肯定的。
最簡單的辦法就是不同的武器用不同的發動機。
大多數FPS遊戲引擎可以處理兩種類型的子彈模擬。所以妳可以選擇擁有各種武器。俠盜獵車手、半條命等遊戲都有可以支持兩種物理類型的武器。
比如《光暈》裏的突擊步槍用的是命中掃描引擎,而柳葉刀槍用的是子彈彈道模型。
遊戲開發者也可以將兩種技術混合使用,彌補各自系統的弱點,從而提供更真實的體驗。
比如從彈道上解決物體互相穿透的問題,我們可以在發動機的每壹個瞬間畫子彈射線,看看射線會不會相交。
妳也可以混合兩種算法來增強遊戲的功能。
狙擊精英系列就是壹個很好的例子。扣動扳機後,引擎將使用hitscan來確定子彈是否離目標足夠近,以觸發慢動作。如果結果為真,引擎將計算子彈時間內的彈道。
參考鏈接:/blogs/Tristan Jung/20191206/355250/how _ do _ bullets _ work _ in _ video _ games.php。