2011-04-06 93 views
0

我正試圖在平面3D表面上找到我的鼠標的座標。在Google上搜了一下之後,我發現你使用gluUnProject來做這件事。所以,我實現了這一點。這裏是我的代碼(帶走那些不感興趣的部分時):gluUnProject()爲什麼不行爲?

public class Input { 
private FloatBuffer modelView = BufferUtils.createFloatBuffer(16); 
private FloatBuffer projection = BufferUtils.createFloatBuffer(16); 
private IntBuffer viewport = BufferUtils.createIntBuffer(16); 
private FloatBuffer location = BufferUtils.createFloatBuffer(3); 
private FloatBuffer winZ = BufferUtils.createFloatBuffer(1); 

public float[] getMapCoords(int x, int y) 
{ 
    modelView.clear().rewind(); 
    projection.clear().rewind(); 
    viewport.clear().rewind(); 
    location.clear().rewind(); 
    winZ.clear().rewind(); 

    glGetFloat(GL_MODELVIEW_MATRIX, modelView); 
    glGetFloat(GL_PROJECTION_MATRIX, projection); 
    glGetInteger(GL_VIEWPORT, viewport); 

    float winX = (float)x; 
    float winY = (float)viewport.get(3) - (float)y; 

    glReadPixels(x, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, winZ); 
    gluUnProject(winX, winY, winZ.get(0), modelView, projection, viewport, location); 
    return new float[] {location.get(0), location.get(1), location.get(2)}; 
} 
} 

當我調用該函數,通過在X和鼠標Y座標,我得到一些數字,到100,每增加像素我用我的鼠標移動(它應該在1左右)。從各種變量做了一些打印後,我發現winZ緩衝區包含值1.0。我的gluPerspective的設置方式是它的臨近剪切點爲0.1,遠點爲10000,這就可以解釋爲什麼這個數字正在迅速增加。然而我不知道如何強迫openGl使用我的平面來代替這個距離。

所以現在我想知道;如果這是在3D世界中找到表面上鼠標座標的正確/最好/最簡單的方法,那麼我會做錯什麼?如果不是,那麼做什麼更好?

回答

0

是的,這是使用正確的方法。你可能只是在矩陣不包含「好值」的地方調用它(可能是由代碼中的glPush/PopMatrix()函數引起的)。

爲了確認您獲得了很好的座標,在獲得座標後,繪製一個GL_POINT(禁用深度測試並將點大小增加到10像素)。如果點在你的鼠標下移動,那麼計算的座標是正確的,但矩陣不是。

+0

不久前我真的解決了它。我實際上不記得如何,但無論如何都有一些聲譽:) – Bartvbl 2012-02-13 22:11:53

+0

謝謝:)下一次,嘗試發佈其他人的解決方案。此外,它會將您的問題標記爲「已回答」,並將其從未回答的問題列表中刪除,這是一件好事。 – 2012-02-14 12:33:05