我如何从android opengl中的触摸获得精确的opengl坐标

时间:2014-08-31 09:53:09

标签: android opengl-es opengl-es-2.0

我在Android开发者网站上使用了opengl ES 2.0示例。

我在屏幕上找到了在Android中使用触摸事件的协议。

public boolean onTouchEvent(MotionEvent e) {
    float x = e.getX();
    float y = e.getY();
}

任何人都可以帮助我将它们转换为openGL世界坐标。

2 个答案:

答案 0 :(得分:0)

编辑: 你是对的,默认的openGL坐标系统的中心位于屏幕的中心,但你可以轻松改变它。我不太喜欢android开发者网站上显示的方法。以下是设置场景以使坐标从左下角开始的示例。

private final float[] mMVPMatrix = new float[16]; // this is the matrix you will send to your shader
private final float[] mProjectionMatrix = new float[16];
private final float[] mViewMatrix = new float[16];

public void onSurfaceChanged(GL10 unused, int width, int height) {
    GLES20.glViewport(0, 0, width, height);
    Matrix.orthoM(mProjectionMatrix, 0, 0f, width, 0.0f, height, 0, 1);
    // Set the camera position (View matrix)
    Matrix.setLookAtM(mViewMatrix, 0, 0f, 0f, 1, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    // Calculate the projection and view transformation
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
}

请注意,使用此方法,您可以在屏幕空间中设置图形的坐标,这比< -1,1>更方便。在我看来,范围很广。

现在您可以使用此代码获取触摸的坐标:

public boolean onTouchEvent(MotionEvent event) {
    float touch_x = event.getRawX();
    float touch_y = yourScreenHeight - event.getRawY();
}

答案 1 :(得分:0)

把这个放在onSurfaceChanged函数中,这将改变android使用的坐标系:

      float [] ortho=
    {
    2f/width,   0f,         0f, 0f,
    0f,        -2f/height,  0f, 0f,
    0f,         0f,         0f, 0f,
    -1f,         1f,         0f, 1f
    };
float ratio = width / height;
//public static float[] m2dProjectionMatrix = new float[16]; 
System.arraycopy(ortho, 0, Render.m2dProjectionMatrix, 0,ortho.length);

GLES20.glViewport(0, 0, width, height);
Render.width=width;
Render.height=height;
 //public static float[] mModelMatrix= new float[16]; 
Matrix.setIdentityM(Render.mModelMatrix, 0);

你在顶点着色器m2dProjectionMatrix和mModelMatrix中需要这个2浮点矩阵,你也需要这一行

 gl_Position = (m2dProjectionMatrix ) *mModelMatrix * vec4(a_Position.xy, 0.0, 1.0);

a_Position.xy是您触摸的坐标,如果您想通过修改mModelMatrix来移动原点,可以这样做:

    //mMoveMatrix is an array like the other two
    // positionX and positionY is the coordinates to move the origo
    Matrix.setIdentityM(mMoveMatrix, 0);
    Matrix.translateM(mMoveMatrix, 0, positionX, positionY, 0);
    Matrix.multiplyMM(mMoveMatrix, 0, Render.mModelMatrix, 0, mMoveMatrix, 0);
   // use mMoveMatrix insted of mModelMatrix

我希望我没有搞砸,它会工作