2012-02-05 27 views
0

我想我的投影有問題。這是怎麼設置我的GL觀點:Android OpenGL ES投影:爲什麼我的原點位於左下角。

@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角落的起源。

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; 
    } 

} 

這只是混淆了我,現在,IM afraif會導致更嚴重的問題,如果我不解決/明白什麼導致了這些問題。

回答

0

在opengl中,默認情況下,左下角是默認的原點。

+0

是的,正如我讀你的答案,我發現這個http://www.opengl.org/archives/resources/features/KilgardTechniques/oglpitfall/。同樣在我的觸摸處理程序中,getY和getX讓我查看與rawX和rawY相關的相對座標,這使得屏幕相對。謝謝。 – twDuke 2012-02-05 13:24:08

相關問題