2010-09-03 58 views
2

我正在開發基本上由AABB盒子製成的整個地形的遊戲。我知道每個盒子的頂點,最小值和最大值。我也設置我的相機是這樣的:在鼠標下查找對象

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glRotatef(Camera.rotx,1,0,0); 
glRotatef(Camera.roty,0,1,0); 
glRotatef(Camera.rotz,0,0,1); 

glTranslatef(-Camera.x,-Camera.y,-Camera.z); 

我想要做的是基本上找到鼠標的立方體。我想給鼠標定位一個向前的方向矢量,直到「鼠標子彈」擊中某物爲止。然而,這涉及多次對所有對象進行交互。有沒有一種方法可以通過遍歷所有對象一次來完成?

感謝

+2

也許http://gamedev.stackexchange.com/是一個更好的地方問? – GSerg 2010-09-03 21:24:41

+1

爲什麼你必須迭代幾次? – 2010-09-03 21:25:09

+0

不錯的問題,但也標記爲3D採摘。 – hydrogen 2010-09-03 21:25:20

回答

3

這通常被稱爲「採摘」 This here看起來像一個很好GL基於鏈接

如果是tldr,那麼基本算法可以使用由Z

  1. 排序對象(或保留他們按z排序,或深度緩衝技巧等)
  2. 迭代並執行邊界測試,當您點擊第一個時停止。
1

這就是所謂的光線追蹤(哎呀,我的錯誤,它實際上是光線投射)。每個物理引擎都有這個功能。你可以看看最簡單的一個 - ODE,或者它的派生 - 子彈。他們是開源的,所以你可以拿出你不需要的東西。他們都有一個方便的數學庫,可以處理所有經常需要的矩陣和頂點操作。 他們都有關於如何完成這項任務的演示。

0

有OpenGL中有很多關於命中測試信息比在OpenGL FAQ

0

我建議你考慮一個更大的角度看這個問題。

方塊只是分數較低的點。訣竅是減少鼠標的分辨率來找出它在哪個盒子上。

您可能必須執行2d到3d的轉換(反之亦然)。在大多數遊戲中,鼠標存在於二維座標世界中。鼠標下面的東西是3D宇宙的二維投影。

0

您想要使用3D拾取算法。這個想法是,你從虛擬世界中的用戶位置向點擊方向繪製光線。 This blog post非常清楚地解釋瞭如何實現這樣的算法。本質上,您的屏幕座標需要從屏幕空間轉換到虛擬世界空間。有一個網站對所涉及的各種轉變有非常好的描述,而且由於我的排名,我無法發佈鏈接。搜索鉤子的鼠標採摘算法書[我沒有自己的網站,我沒有撰寫文檔]。

一旦你在所需的方向上得到了射線,就需要對現實世界中的幾何體進行交叉測試。由於您完全具有AABB框,因此可以使用簡單的矢量方程來檢查哪條几何圖形與光線相交。我會說,將你的盒子近似爲球體會使生活變得非常簡單,因爲有一個非常簡單的球體射線相交測試。所以,你的光線將由你從第一步獲得的東西(第一步繪製的光線)來描述,然後你需要使用相交測試。如果你可以使用球體,那麼球體的中心就是你畫出盒子的點,直徑就是盒子的寬度。

祝你好運!