我正嘗試使用OpenGL ES爲Android創建應用程序,但我在處理觸摸輸入時遇到了問題。將對象座標轉換爲屏幕座標Android OpenGL ES
我創建了一個CubeGLRenderer類,它生成一個Cube。 CubeGLRenderer負責投影和視圖矩陣,Cube負責其模型矩陣。立方體沿着正X軸移動,以沿Y也不Z.
CubeGLRenderer沒有移動更新視圖矩陣中的每一幀,以便沿與立方體移動,使得在屏幕上該立方體的外觀固定:
Matrix.setLookAtM(mViewMatrix, 0, 0.0f, cubePos.y, -10.0f, 0.0f, cubePos.y, 0.0f, 0.0f, 1.0f, 0.0f);
無論何時屏幕尺寸改變(即設備的方向改變),都會計算投影矩陣。然後將這兩個矩陣混合並傳遞給Cube.draw(),在該矩陣中應用其模型矩陣並將其自身渲染到屏幕上。
到目前爲止,這麼好。我們繼續討論這個問題。
我想觸摸屏幕並計算從立方體的屏幕座標中心到我觸摸的屏幕點的角度。
我以爲我只是用GLU.gluProject()完成這個工作,但是我沒有正確使用它,或者根本就沒有理解它。
下面是我用它來計算出屏幕上的代碼座標從立方體的世界座標:
public boolean onTouchEvent(MotionEvent e) {
Vec3 cubePos = cube.getPos();
float[] modelMatrix = cube.getModelMatrix();
float[] modelViewMatrix = new float[16];
Matrix.multiplyMM(modelViewMatrix, 0, mViewMatrix, 0, modelMatrix, 0);
int[] view = {0, 0, width, height};
float[] screenCoordinates = new float[3];
GLU.gluProject(cubePos.x, cubePos.y, cubePos.z, modelViewMatrix, 0, mProjectionMatrix, 0, view, 0, screenCoordinates, 0);
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d("CUBEAPP", "screenX: " + String.valueOf(screenCoordinates[0]));
break;
}
return true;
}
我在做什麼錯?
你的輸出是什麼樣的? –
儘管您計算它,但似乎並未使用modelViewMatrix矩陣,但仍使用modelMatrix。 –
對不起,我從來沒有用過這個,但如果我正確理解方法,你需要使用modelViewMatrix開始。其他可能的問題是你應該嘗試交換乘法命令來獲得模型視圖矩陣(矩陣相乘時的順序很重要)。由於許多系統以原點位於左下方的方式工作,因此您可能需要在視圖座標中使用(0,高度,寬度,高度),或者將與接收數據一起使用時的水平座標反轉爲(height-touch.y )。 –