遊戲里如何實現 "敵人發現了你"?

比如在 MGSV 里, Snake 身體的一部分出現在敵人視野範圍就會被發現.

僅使用視錐檢測不能排除障礙物遮擋, 那麼就需要進一步的檢測.

"進一步的檢測" 我想到的是射線, 但如何確定哪些點需要執行射線檢測呢? 即使預先在人體表面放置很多點, 數量也是很大的, 當玩家出現在多個敵人的視錐內時性能上可能無法接受.


一般是在CPU上做光線投射(ray cast),例如由NPC的兩眼中心點發射多條射線,至玩家角色的頭、胸口、手掌、腳掌、槍頭等位置。如果做個現實比喻,就好像在動作捕捉時是否看到那些反光球一樣:

(Photo by Patrick Oscar Boykin CC https://www.flickr.com/photos/14666127@N06/2418995400)

更精確的可見性測試需要很大計算量,例如從NPC眼睛位置對玩家角色範圍做光柵化,一般不會這麼做。

在 CPU 上做光線投射可使用一些場景管理/可見性檢測的數據結構以加速過程,例如潛在可見集(Potentially visible set, PVS)、Portal、Octree、Binary space partitioning等。也要考慮材質的透光性,例如有色玻璃、灌木是否可以讓射線穿過,或做成衰減。

我不肯定有沒有遊戲會考慮反差,例如穿綠色迷彩在草叢中的可見性較低,但應該不難模擬。

另外,除了NPC的視覺模擬,很多時候還需要加上聽覺模擬。

P.S. 《遊戲引擎架構》P.563 講述光線投射的原理,並剛好有這個應用的描述。


你看到的模型未必就是用來做判定的模型。你眼中的Snake是一整個人,敵兵眼中的Snake可能就只是幾個小圓點。

——————————

MGS系列有個傳統——當你匍匐到洞里、管道里或者床下面的時候,會進入西斯空寂的第一人稱視角。

以MGS3為例,大家都知道遊戲初期會有一段和8個敵兵的遭遇戰,其中會有三四個人闖進Snake所在的小屋搜查,那個小屋裡有張單人床,一般來說你事先趴在床底下的話它們是看不到你的,然後扔閃光雷就搞定了。

於是我腦補了一下那個場景。

如果沒有強制轉到第一人稱視角的話……

大概會是這樣的……

……掩耳盜鈴感。

知道為什麼BB是二十世紀最牛逼的戰士了吧?……這都能讓人看不見……自帶鴕鳥迷彩啊……(Venom和SS也都會這一招)


小時候玩的盟軍敢死隊,好像用一個什麼道具,那裡面每個敵人的視線範圍都有明確的一個顯示,我想那也正是演算法裡面實現的方法把,。


直接用絕對距離吧

兩人之間沒有遮擋,然後敵人視線又正好面向你

直接計算兩個人質心的距離就可以了,不需要用什麼點來設置


給敵人畫一個圈,如果你不幸地走進了這個圈裡,並且敵人此時正對著你,你就被發現了


國內某廠的網遊,互相發現只有5個點,手臂頂端,頭,雙腳正中,軀幹。其實根本不耗費多少資源


想起steam版忍者印記,它的dlc會在場景各處設置氣泡,打中了會顯示製作者對於這裡的場景設置的想法。因為這遊戲是個潛入遊戲,所以不光會被敵人看見,也會聽見。 裡面就有一個很有趣的思路,說殺了人的屍體,不藏起來會被場景里的複數敵人發現,每個敵人的視覺範圍聽覺範圍都不同,然後又有不同的巡邏路線,如何設計會容易做一些。

結論是讓屍體「發現」敵人,而不是敵人「發現」屍體。屍體是固定地點固定範圍,然後不斷探測範圍內有沒有敵人,有了就「發現」了。


其實只要你不動,就算背部裸露一點,也不會被發現的。而且距離遠的話,即便被手電筒照到了,只要不動,也不會發現。估計他是運動轉態下有加權值


一般情況下會是檢測模型上幾個固定點到NPC的連線是否會被遮擋.

這個方法可以說是最有效率也最簡單的了,擴展性也不錯,比如說草叢等"半遮蔽"效果也可以通過簡單的加入一個遮蔽係數來完成.

就應用來說,WOT(坦克世界)中一局15vs15的比賽,配合一定量的優化代碼所有遮蔽判定可以在伺服器上實時完成.


在視線範圍內抽取一些射線就是


頭上出現"!"


推薦閱讀:

《InsideUE4》GamePlay架構(四)Pawn
遊必有方 Vol.10 NYU Practice 系列活動現場彙報(上)
技術宅救世界:英國遊戲行業的啟蒙往事
寫在《卡片怪獸》成功之前

TAG:遊戲 | 人工智慧 | 遊戲開發 | 物理引擎 |