2010-09-08 31 views
0

我的小遊戲引擎基本上有一個3D數組Cubes [x] [y] [z](其實它是一個很大的一維數組,但我做了一些重載)。我知道玩家站在X Y Z的哪個立方體。玩家將能夠拍攝立方體來摧毀它,這就是爲什麼我需要弄清楚如何找到鼠標所在的立方體。我發現了一些關於採摘的OpenGL文檔,但是這種方法很慢。由於我的立方體是有組織的,並且我知道玩家在哪個立方體上,並且相機在X和Y上的角度(相機不在Z上旋轉),並且鼠標總是處於screenwidth/2,screenheight/2我確定theres比GL採摘技術更快的方式。鼠標下的對象?

這裏是相機的設置方式:

void CCubeGame::SetCameraMatrix() 
{ 

    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); 
} 

void CCubeGame::MouseMove(int x, int y) 
{ 
    if(!isTrapped) 
     return; 

    int diffx = x-lastMouse.x; 
    int diffy = y-lastMouse.y; 

    lastMouse.x = x; 
    lastMouse.y = y; 
    Camera.rotx += (float) diffy * 0.2; 
    Camera.roty += (float) diffx * 0.2; 
    if(Camera.rotx > 90) 
    { 
     Camera.rotx = 90; 
    } 

    if(Camera.rotx < -90) 
    { 
     Camera.rotx = -90; 
    } 

    if(isTrapped) 
    if (fabs(ScreenDimensions.x/2 - x) > 1 || fabs(ScreenDimensions.y/2 - y) > 1) { 
     resetPointer(); 
    } 

} 

Vertex3f CCubeGame::MoveCamera(int direction, float amount) 
{ 
    float xrotrad, yrotrad; 
    Vertex3f result(0,0,0); 

    switch(direction) 
    { 
    case CAM_FORWARD: 
     yrotrad = (Camera.roty/180 * 3.141592654f); 
     xrotrad = (Camera.rotx/180 * 3.141592654f); 

     result.x = float(sin(yrotrad)) * amount; 
     result.z = -(float(cos(yrotrad)) * amount); 
     result.y = 0; 
     //Camera.y -= float(sin(xrotrad)) * amount; 
     break; 
    case CAM_BACKWARD: 
     yrotrad = (Camera.roty/180 * 3.141592654f); 
     xrotrad = (Camera.rotx/180 * 3.141592654f); 
     result.x = -(float(sin(yrotrad)) * amount); 
     result.z = float(cos(yrotrad)) * amount; 
     result.y = 0; 

     //Camera.y += float(sin(xrotrad)) * amount; 
     break; 
    case CAM_RIGHT: 
     yrotrad = (Camera.roty/180 * 3.141592654f); 
     result.x = float(cos(yrotrad)) * amount; 
     result.z += float(sin(yrotrad)) * amount; 
     result.y = 0; 
     break; 
    case CAM_LEFT: 
     yrotrad = (Camera.roty/180 * 3.141592654f); 
     result.x = -(float(cos(yrotrad)) * amount); 
     result.z = -(float(sin(yrotrad)) * amount); 
     result.y = 0; 
     break; 
    default: 
     break; 
    } 

    Camera.x += result.x; 
    Camera.y += result.y; 
    Camera.z += result.z; 

    return result; 

} 

感謝

回答

0

如果無法Z軸旋轉,那麼你只能在同一Z高度拍攝的立方體的槍在。這使得事情變得簡單很多,因爲你可以用Z對你的立方體進行排序,並丟棄任何太高或太低的立方體(如果這些立方體可以處於分數高度,則需要多少立方體才能獲得log(N)時間;如果它們都是相同的高度和全部在相同的高度,你只是索引到數組的部分)。

現在你需要從槍中劃出一條直線通過網格並找出它首先擊中哪個立方體。要做到這一點的方法是沿槍線路的向量:

v = (cos(angle), sin(angle)) 

,並找到每個邊界,該線橫跨在X或Y的整數如果我們在

(x0,y0) 

開始與和在方向v行進然後我們將擊中(假定COS(角度)> 0)

ceil(x0), ceil(x0+1), ... 

有時

(ceil(x0)-x0)/cos(angle), (ceil(x1)-x1)/cos(angle), ... 

以及類似的y0sin(angle)。現在你只是走在時間列表 - 這將帶你進入一個新的廣場 - 第一次遇到一個立方體,你打它。

如果立方體陣列不是巨大的,那麼整個處理器應該只需要幾微秒(可能在嵌入式處理器上幾百微秒)。

+0

實際上,關於Z高度,玩家可以上下看,槍在玩家臉部的中心位置,屏幕的中心也是,我的立方體已經Z排序了嗎?如立方體(5,5,5)旁邊的立方體(5,5,6)。 – jmasterx 2010-09-08 17:37:12