我在Android开发者网站上使用了opengl ES 2.0示例。
我在屏幕上找到了在Android中使用触摸事件的协议。
public boolean onTouchEvent(MotionEvent e) {
float x = e.getX();
float y = e.getY();
}
任何人都可以帮助我将它们转换为openGL世界坐标。
答案 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
我希望我没有搞砸,它会工作