2015-10-06 204 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

相关问题