2012-03-07 16 views
1

我有2個問題。一個是關於爲什麼我的代碼無法按預期工作,另一個是設計問題的具體問題。 (特定問題):我試圖在二維貼片引擎(使用x/y軸,z = 0)中將屏幕座標映射到世界座標。我已經使用了訥河的教程端口如何實現這一目標,但我得到的結果並不像預期的那樣。使用gluUnProject +設計討論的世界轉換的Java OpenGL屏幕

我有一個名爲MouseController的類。每當一個鼠標事件觸發時(通過swing的MouseListener),我將MouseEvent傳遞給我的MouseController。

在我的GLCanvas繪圖函數中,我調用了MouseController.processClick(GL)函數,以便能夠將當前的gl上下文傳遞給processClick函數並獲取模型視圖,投影矩陣和視口。

當我點擊屏幕上呈現的塊時,回饋給我的世界座標幾乎毫無意義。首先,我期望z值爲0,但它的9(這是我的相機設置的高度),並且我的x和y值總是非常接近0(偶爾會跳到1-9非常高輕微的動作,然後回到非常接近0的數字)。

任何人都知道爲什麼這可能是這種情況?該processClick功能如下:

public void processClick(GL gl) { 

     int x = e.getX(); 
     int y = e.getY(); 

     if(e.getButton() == MouseEvent.BUTTON1) { 

      gl.glGetIntegerv(GL.GL_VIEWPORT, viewPort, 0); 
      gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, mvMatrix, 0); 
      gl.glGetDoublev(GL.GL_PROJECTION_MATRIX, prMatrix, 0); 

      int realy = viewPort[3] - y; 

      glu.gluUnProject((double)x, (double)realy, 0, mvMatrix, 0, prMatrix, 0, viewPort, 0, wCoord, 0); 

      System.out.println(x + " " + y); 
      System.out.println(x + " " + realy); 
      System.out.println(wCoord[0] + " " + wCoord[1] + " " + wCoord[2]); 
     } 

     e = null; 
    } 

樣本輸出我從上面的功能得到當我點擊,我在世界座標繪製一個正方形屏幕(4,5,0)上:

878 56 
    878 636 
    0.0445182388817236 0.055475957454737095 8.900000001489369 

謝謝!

編輯:閱讀在深度緩衝使用glReadPixels和使用,作爲Z(返回1)得到我的結果是一種權利,但過大的的20

的因素編輯2:如果我將遠剪裁平面設置爲與相機高度相同的值,它似乎可以工作(但這並不適合)。

2(設計問題):我覺得在OpenGL畫布的繪製函數中處理點擊是沒有意義的。我似乎要求該函數的GL能夠檢索gluUnProject運行所需的矩陣。你們如何設計這個?理想情況下,我覺得我應該能夠完全分開繪圖功能。將一個對gl對象的引用存儲到我的MouseController中,並在MouseListener接受它時處理該點擊。

關於你們如何處理它的輸入將會非常感謝!

回答

0

我決定只是使用gluOrtho2D來設置我的投影來簡化解決這個問題。

唯一的「棘手」的事情是在實際的屏幕分辨率達到了gluOrtho2D,這可能被檢索(和存儲)通過與:

getContentPane().getSize() 

從我用的JFrame。

在面板上設置首選尺寸,然後包裝框架取得了近似的結果,但面板本身仍然略微偏離。

相關問題