2012-12-28 69 views
0

在我的GLSurfaceView.Renderer中,我以兩部分來描繪我的場景。第一組是偏移和旋轉,而第二組是對齊到「相機」,所以我應用glRotate和glTranslate,然後應用完全相反的glTranslate和glRotate。在某些設備上,這可以正常工作,但在其他設備上,整個場景會慢慢旋轉「中心」。場景慢慢旋轉

圖片:At startAfter ~5 mins

這裏的的onDraw()函數:

@Override 
public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 

    // rotate card table 
    gl.glRotatef(-20f, 1f, 0f, 0f); 
    gl.glRotatef( 5f, 0f, 1f, 0f); 
    gl.glRotatef(-10f, 0f, 0f, 1f); 
    gl.glTranslatef(1f, 3f, 0f); 

    mDeck.draw(gl); 

    // undo rotate for buttons/overlays 
    gl.glTranslatef(-1f, -3f, 0f); 
    gl.glRotatef(10f, 0f, 0f, 1f); 
    gl.glRotatef(-5f, 0f, 1f, 0f); 
    gl.glRotatef(20f, 1f, 0f, 0f); 

    mOverlayBtns.draw(gl); 
    mPass.draw(gl); 
} 

完整的源代碼可以在GitHub上找到,here.

有什麼明顯的我失蹤?有更好的方法來處理旋轉,然後旋轉回來嗎?

到目前爲止,我已經注意到了這個問題:

  • 另一個LG手機的名字我不記得
  • 這些設備做

    • 的Nexus 4
    • HTC感覺不顯示問題:

      • Galaxy Nexus
      • 的Nexus 7
      • Xoom的

    回答

    1

    您的代碼每幀應用一組仿射變換,問題是每個變換都是累積的,所以您一次又一次地應用了變換。您可能需要使用glLoadIdentity(http://www.khronos.org/opengles/sdk/1.1/docs/man/glLoadIdentity.xml)重置當前加載的MODELVIEW矩陣,或者按下當前矩陣,加載您的新矩陣,繪製然後彈出矩陣(就像您在修復響應中那樣)。

    我會在每幀畫的開始處放一個glLoadIdentity。此外,與您的修復,我也會這樣做:

    gl.glPushMatrix(); 
    
    gl.glLoadIdentity(); // Be sure we start clean 
    
    // rotate card table 
    gl.glRotatef(-20f, 1f, 0f, 0f); 
    gl.glRotatef( 5f, 0f, 1f, 0f); 
    gl.glRotatef(-10f, 0f, 0f, 1f); 
    gl.glTranslatef(1f, 3f, 0f); 
    
    mDeck.draw(gl); 
    
    gl.glPopMatrix(); 
    

    希望幫助。

    0

    我已經找到了問題的解決辦法,但我仍然希望有人能夠解釋我上面看到的問題。

    而不是旋轉場景,然後旋轉回來,我可以使用glPushMatrix和glPopMatrix來隔離這兩個組。這樣,glTranslate和glRotate將場景移回的組是不必要的。

    @Override 
    public void onDrawFrame(GL10 gl) { 
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    
    
        gl.glPushMatrix(); 
    
        // rotate card table 
        gl.glRotatef(-20f, 1f, 0f, 0f); 
        gl.glRotatef( 5f, 0f, 1f, 0f); 
        gl.glRotatef(-10f, 0f, 0f, 1f); 
        gl.glTranslatef(1f, 3f, 0f); 
    
        mDeck.draw(gl); 
    
        gl.glPopMatrix(); 
    
    
        gl.glPushMatrix(); 
        // undo rotate for buttons/overlays 
        // gl.glTranslatef(-1f, -3f, 0f); 
        // gl.glRotatef(10f, 0f, 0f, 1f); 
        // gl.glRotatef(-5f, 0f, 1f, 0f); 
        // gl.glRotatef(20f, 1f, 0f, 0f); 
    
        mOverlayBtns.draw(gl); 
        mPass.draw(gl); 
    
        gl.glPopMatrix(); 
    }