我正試圖在Android中使用3D(OpenGL ES)實現「whack-a-mole」類型的遊戲。現在,在任何給定時間我都有一個3D形狀(旋轉立方體),代表我的「鼴鼠」。我在我的視圖中有一個觸摸事件處理程序,它在我的渲染器中隨機設置一些x,y值,導致立方體移動(使用glTranslatef())。在3D「場景」中處理觸摸事件或屏幕到3D座標
我還沒有遇到任何教程或文檔,完全橋接屏幕觸摸事件到3D場景。我已經做了很多工作,以到達我所在的位置,但我似乎無法完成剩餘的任務。
從developer.andrdoid.com我用我猜可能被視爲輔助類的矩陣:MatrixGrabber.java,MatrixStack.java和MatrixTrackingGL.java。
我在我的GLU.glUnProject method中使用這些類,它應該做從真實屏幕座標到3D或物體座標的轉換。
段:
MatrixGrabber mg = new MatrixGrabber();
int viewport[] = {0, 0, renderer._width, renderer._height};
mg.getCurrentModelView(renderer.myg);
mg.getCurrentProjection(renderer.myg);
float nearCoords[] = { 0.0f, 0.0f, 0.0f, 0.0f };
float farCoords[] = { 0.0f, 0.0f, 0.0f, 0.0f };
float x = event.getX();
float y = event.getY();
GLU.gluUnProject(x, y, -1.0f, mg.mModelView, 0, mg.mProjection , 0, viewport, 0, nearCoords, 0)
GLU.gluUnProject(x, y, 1.0f, mg.mModelView, 0, mg.mProjection , 0, viewport, 0, farCoords, 0)
這段代碼執行沒有錯誤,將輸出看起來不正確的。我知道屏幕左下角有原點(0,0)。而3D場景,至少是我的,似乎有一個經典的笛卡爾系統在屏幕中間的起源。因此,在屏幕座標爲(0,718)的位置觸摸左下角,運行我的代碼。我從去年參數gluUnProject輸出:
靠近:{-2.544,2.927,2.839,1.99}
遠:{0.083,0.802,-0.760,0.009}
這些數字不對我有意義。我的觸摸甚至在第三象限,所以我所有的近距離和遠距離的x,y值應該是負的,但它們不是。 gluUnProject文件沒有提到任何需要轉換屏幕座標。然後再一次,相同的文檔會讓你相信Near和Far應該是3號的數組,但它們必須是4號,我沒有CLUE的原因。
所以,我有兩個問題(我敢肯定會有更多的問題出現)。
- 我怎樣才能確保我得到適當的近和遠的座標基於屏幕座標 。
- 一旦我有近和遠的座標,我如何使用它來查找它們創建的線是否與屏幕上的對象相交。
謝謝您的回答和編輯。假設我的gluUnProject工作正常,我想了解更多有關如何使用座標來檢測碰撞的信息。我遇到的大多數資源都提示「雷霆萬鈞」,但實際上並沒有提供任何關於如何「走線」的信息,以查看它是否與屏幕上的對象相交。也許這並不像我想要的那樣困難,但是我已經爲此做了一些工作,而且這裏的資源也很差。 – Pete
這個[Wolfram頁面](http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html)很好地解釋了與邊界球體的相交。意思是,對於命中測試來說,計算球體中心點與該線的距離並將其與半徑進行比較就足夠了。 – harism