2013-11-14 85 views
0

我正在製作一個簡單的3D OpenGL遊戲。目前我有四個圍牆,一個隨機分佈的內牆和一個簡單的四邊形立方體給我的玩家。四邊形之間的碰撞檢測OpenGL

我想設置玩家和所有牆壁之間的碰撞檢測。這對於邊界牆很容易,因爲我可以檢查x或z座標是小於還是大於一個值。問題在於內牆。我有一個保存小矩形牆段的glGenList,在最初的設置中,我隨機生成一個x,z座標的數組,並將這些牆段轉換到繪製場景中的這個位置。我還增加了一個45度或90度的旋轉角度,這會使碰撞檢測複雜化。

任何人都可以幫助我如何在這裏探測碰撞。我有每個牆段的座標,每個牆段的大小以及玩家的座標。

我會在玩家和牆壁周圍看一個有界的盒子,還是有更好的選擇?

+0

'glGenLists'? 2013年顯示列表(差不多2014年)?夥計,這些東西已被棄用了很長時間。不要使用它們。 – datenwolf

回答

0

我認爲你的問題主要是關於一個角度,這在本質上是一樣的,這有你怎麼在這裏做一個回答:「如果一個點的直線相匹配檢測」檢測與牆的碰撞:

How can I tell if a point belongs to a certain line?

(代碼可能是C#,但它背後的數學適用於任何語言)。您只需在這些公式中替換Z中的Y,因爲Y似乎不是您當前設計中的一個因素。

已經有很多文章甚至是關於如何做好「碰撞檢測」的書籍。其中一部分當然歸結爲「你想要非常準確還是非常快速的代碼」 - 對於「完美」的模擬,你可能爲了準確性而犧牲速度。在大多數比賽中,球員身體只是稍稍「凹陷」牆壁,因爲球員已經越過了牆壁交叉點,這也許是可以接受的。

「劃分空間」也很有用。對此的常見方式是「二進制空間分區」,這裏有很好的描述和說明: http://en.wikipedia.org/wiki/Binary_space_partition

關於遊戲編程的書應該涵蓋碰撞檢測的基本原理。在網上也有很多關於它的文章,包括維基百科中的一個條目:http://en.wikipedia.org/wiki/Collision_detection

+0

我會看到這可以爲我工作。如果沒有必要讓牆壁成角度,並且我相信用直邊牆壁會更容易。 –

+0

我從來沒有聽說過用於3D世界的二進制空間分區。通常對於2D遊戲,我已經看到了四叉樹,三維世界的八叉樹。 –

0

製作剛體物理引擎的缺點是,可以使用點對點距離來查看是否有任何立方體角點較少遠離飛機0.0f(我會使用FLT_MIN,因此這些點對他們來說有一點半徑)。您將需要存儲一個標準化的三維矢量(長度爲1.0f的矢量)以表示該平面的法線。如果從平面中心到點的矢量與平面法線之間的點積小於碰撞的半徑,之後,您可以獲取立方體的速度(矢量的長度),將其乘以0.7f以獲得一些能量吸收,並將其存儲爲立方體新速度。然後在平面的法線上反映立方體的歸一化速度矢量,然後將其乘以之前計算的立方體的新速度。

如果你真的想進入遊戲物理,請從this guys github獲取一個拉。我已經將他的書用於物理學遊戲課程。本書中有一些錯誤,所以一定要從github獲取所有代碼示例。他經歷了一個大規模的聚合物理引擎和一個剛體。我也會研究矩陣和張量。

+0

我會看看你的建議,我只是在尋找基本的碰撞檢測,在這個階段我不需要考慮任何反作用力,複雜性也不會證明使用任何物理引擎是合理的。 –

+0

在這種情況下,只需使用點到飛機的碰撞。 此鏈接在底部有一個代碼示例。 http://geomalgorithms.com/a04-_planes.html –