2015-10-06 201 views
0

我正嘗試使用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; 
} 

我在做什麼錯?

+0

你的輸出是什麼樣的? –

+0

儘管您計算它,但似乎並未使用modelViewMatrix矩陣,但仍使用modelMatrix。 –

+0

對不起,我從來沒有用過這個,但如果我正確理解方法,你需要使用modelViewMatrix開始。其他可能的問題是你應該嘗試交換乘法命令來獲得模型視圖矩陣(矩陣相乘時的順序很重要)。由於許多系統以原點位於左下方的方式工作,因此您可能需要在視圖座標中使用(0,高度,寬度,高度),或者將與接收數據一起使用時的水平座標反轉爲(height-touch.y )。 –

回答

0

您在渲染立方體的頂點着色器中所做的相同計算應該用於將立方體中心轉換爲屏幕空間。

通常情況下,您會將立方體的每個頂點乘以modelViewProjection矩陣,然後將其發送給片段着色器。 您應該使用與頂點着色器完全相同的矩陣,並將立方體的中心與它相乘。然而,將一個4x4矩陣與Vec4頂點(x,y,z,1)相乘會給出(x2,y2,z2,w)的Vec4結果。 爲了獲得屏幕空間座標,你需要用x除以x2和y2! 將其除以w後,xy座標應設置在[-1..1] x [-1..1]範圍內。

爲了得到準確的像素,您需要將x2/w和y2/w歸一化爲[0..1],然後將其乘以屏幕分辨率的寬度和高度。

希望這會有所幫助。

+0

當然!非常感謝你! –

+0

嗨@AbuHassan你解決了這個問題嗎?.....我也試圖獲得我使用gluporoject方法的屏幕位置,但結果很奇怪......我有以下矩陣和頂點 – pritam001

+0

float sRectVerts [] = { -0.5f,-0.5f,0.0f, -0.5f,0.5f,0.0f, 0.5f,0.5f,0.0f, 0.5f,-0.5f,0.0f}; float [] modelView = target.getViewMatrix(); float [] projection = target.getProjectionMatrix(); float [] modelViewprojectionarray = target.getModelViewProjectionMatrix(); – pritam001

相關問題