Android OpenGL ES投影:为什么我的起源左下角。

时间:2012-02-05 12:21:03

标签: android opengl-es

我认为我的投影存在问题。这就是我设置gl视图的方式:

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {

    _displayWidth = width;
    _displayHeight = height;
    _halfWidth = width / 2;
    _halfHeight = height / 2;
    _scaleX = 0.5F;
    _scaleY = 0.5F;
    gl.glViewport(0, 0, _displayWidth, _displayHeight);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluOrtho2D(gl, 0, _displayWidth, _displayHeight, 0);

    DebugLog.i(TAG, "Size changed: " + _displayWidth + " * "
            + _displayHeight);
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    GlSystem.setGl(gl);

    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);

    gl.glClearColor(0.0f, 0.0f, 0.0f, 1);

    gl.glShadeModel(GL10.GL_FLAT);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glEnable(GL10.GL_TEXTURE_2D);

    gl.glDisable(GL10.GL_DITHER);
    gl.glDisable(GL10.GL_LIGHTING);

    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);

    gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
            GL10.GL_MODULATE);

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    String extensions = gl.glGetString(GL10.GL_EXTENSIONS);
    String version = gl.glGetString(GL10.GL_VERSION);
    String renderer = gl.glGetString(GL10.GL_RENDERER);
    boolean isSoftwareRenderer = renderer.contains("PixelFlinger");
    boolean isOpenGL10 = version.contains("1.0");
    boolean supportsDrawTexture = extensions.contains("draw_texture");

    boolean supportsVBOs = !isSoftwareRenderer
            && (!isOpenGL10 || extensions.contains("vertex_buffer_object"));

    DebugLog.i(TAG, version + " (" + renderer + "): "
            + (supportsDrawTexture ? "draw texture," : "")
            + (supportsVBOs ? "vbos" : ""));

    _game.load();
}

图:

 public void draw(float x, float y, float scaleX, float scaleY) {
    GL10 gl = GlSystem.getGl();
    if (gl != null && _sprite != null) {
        gl.glBindTexture(GL10.GL_TEXTURE_2D, _sprite.getTexture());

        float localX = x - (getWidth() * scaleX) / 2;
        float localY = y - (getHeight() * scaleY) / 2;
        float width = getWidth() * scaleX;
        float height = getHeight() * scaleY;

        ((GL11Ext) gl).glDrawTexfOES(localX, localY, 0, width, height);
    }
}

问题是我然而我初始化我的投影我来自屏幕的左下角,Y轴向上(屏幕相对)。原点应该是左上角Y轴向下增加(屏幕相对)。

这不会是一个问题,但是我从MotionEvent收到的坐标是基于一个topleft corner原点。

public class GameView extends GLSurfaceView {
    private TouchHandler _motionHandler;
    public GameView(Context context) {
    super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
    _motionHandler.setMotionEvent(e);

    queueEvent(_motionHandler);

    return true;
    }

        public TouchHandler getMotionHandler() {
    return _motionHandler;
    }

    public void setMotionHandler(TouchHandler motionHandler) {
        _motionHandler = motionHandler;
    }

}  

这只是让我感到困惑,如果我不解决/了解导致这些问题的原因,它会导致更严重的问题。

1 个答案:

答案 0 :(得分:0)

在opengl中,默认情况下左下角是默认的原点。