2011-12-07 114 views
2

我在OpenGL中做遊戲。遊戲包括一架在3D世界中自由飛行的飛機,它必須經過一些特定的區域,就像它正在通過窗戶一樣。現在,我試圖計算飛機與提到的「窗戶」的碰撞。我認爲,作爲第一種方法,爲飛機的軌跡掃描AABB,併爲每個窗口配置一些AABB,例如如果這些AABB重疊,則有飛機經過它的潛在情況。 但是,當我嘗試計算AABB時,問題就開始了,因爲我所知道的每個算法都需要知道同一參考系統中兩個對象(平面+窗口)的座標。我的程序將世界看作是什麼在移動,而不是以原點爲中心的平面(實際上,在z = -10,因此它被渲染)。真正的問題是如何計算從飛機上看到的每個「窗口」的座標。這是我用來畫場景的代碼:計算AABB碰撞

glLoadIdentity(); 

//these are the rotations of the plane of the ground 
glRotatef(RotHorizont, 0.0f, 0.0f, 1.0f); 
glRotatef(-directionX, 1.0f, 0.0f, 0.0f); 
glRotatef(-directionY, 0, 1.0f, 0); 

//and these are the movement of the plane 
//(the multiplication by 0.0174532925f is to convert the angles to radians 
Tx -= (float)Math.sin(directionY * 0.0174532925f) * velocity; 
Tz -= (float)Math.cos(directionY * 0.0174532925f) * velocity; 
Ty -= (float)Math.sin(directionX * 0.0174532925f) * velocity; 

glTranslatef(-Tx, Ty, -Tz); 

/* 
here I draw the ground and the windows 
*/ 
.... 

//and now I draw the plane 
gl.glLoadIdentity(); 
gl.glTranslatef(0.0f, 0.0f, -10.0f); 
/* draw the plane */ 

那麼,我該如何獲得「窗口」的座標? 或者還有其他方法來計算碰撞? 我真的需要你的幫助,我會非常感激。 謝謝大家!

回答

2

您可以通過一個位置定義AABB( 3座標矢量)及其大小(3座標矢量),並應用任何AABB碰撞檢測算法來解決您的問題。

正如您所指出的那樣,計算必須在相同的座標系下完成。但是,由於您正在處理AABB(而不是OBB),因此您無需處理方向(AABB是計算出來的,以便旋轉後對象將保留在其中,或者在每次旋轉對象後重新計算它)。由於「AA」表示「軸對齊」,因此您通常已經在處理一個通用的參照系(否則它將是OBB)。因此,可能需要的唯一「轉換」就是翻譯。如果你的飛機的中心是你的座標系的中心,那麼你飛機的AABB的位置將是(0,0,0)(或(0,0,-10))。對於你的窗戶,這取決於你如何定義這些窗口,但它應該很容易找到他們的中心(用OpenGL處理​​products of transformation matrices,找到把你從原始座標系統移到窗口的那個)。如果您提供更多信息,我們可以爲您提供更多關於如何實現該目標的詳細信息。

鏈接:

+0

非常感謝您的回覆!因此,如果我理解正確,我需要爲每個窗口提取模型矩陣,並獲取該點的原點座標? – WaLi

+0

我試過了,得到了一個窗口的模型矩陣(這是正確的,因爲我已經繪製了矩陣的東西)。但是,我怎樣才能從該矩陣提取座標?我認爲把這個矩陣乘以向量'[0; 0; 0; 1]'(代表窗口的原點),它應該給我從原始系統看到的座標,但它不是那樣的。 例如,用這個矩陣,我怎樣才能提取從飛機上看到的座標? '0.967 0.023 0.253 0.000 -0.112 0.933 0.342 0.000 -0.229 -0.360 0.905 0.000 15.392 89。237 -318.202 1.000' – WaLi

+0

首先,我會說使用OOP處理位置/方向信息的類將是一個好主意。 OpenGL只會用來顯示結果。正如你所看到的,碰撞檢測與顯示無關。你不能那樣做嗎?這可能會讓你的生活更輕鬆。 如果你不能,我想你需要應用反轉轉換矩陣來「返回」到適當的參考框架。 – BenC