2011-09-30 35 views
2
翻譯

我剛開始使用JOGL後如預期,有件事情我一直沒能做到:有基本的繪畫和旋轉的NeHe tutorials一個例子,和一切工作只是很好,除了在第一個三角形之後和下一個四邊形之前使用的glLoadIdentity();。該JOGL代碼是下一個:不能使用glLoadIdentity在JOGL

float rtri = 0.0f; 
float rquad = 0.0f; 

@Override 
public void display(GLAutoDrawable drawable) { 

    final GL2 gl = drawable.getGL().getGL2(); 

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

    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

    gl.glTranslatef(-1.5f,0.0f,-6.0f); 
    gl.glRotatef(rtri, 0.0f, 1.0f, 0.0f); 

    gl.glBegin(GL2.GL_TRIANGLES); 
    { 
     gl.glColor3f(1.0f,0.0f,0.0f); 
     gl.glVertex3f(0.0f, 1.0f, 0.0f); 

     gl.glColor3f(0.0f,1.0f,0.0f); 
     gl.glVertex3f(-1.0f,-1.0f, 0.0f); 

     gl.glColor3f(0.0f,0.0f,1.0f); 
     gl.glVertex3f(1.0f,-1.0f, 0.0f); 
    } 
    gl.glEnd(); 

    // Here seems to be the problem 
    gl.glLoadIdentity(); 

    gl.glTranslatef(3.0f, 0.0f, 0.0f); 
    gl.glRotatef(rquad, 1.0f, 0.0f, 0.0f); 

    gl.glBegin(GL2.GL_QUADS); 
    { 
     gl.glColor3f(0.5f, 0.5f, 1.0f); 
     gl.glVertex3f(-1.0f, 1.0f, 0.0f); 
     gl.glVertex3f(1.0f, 1.0f, 0.0f); 
     gl.glVertex3f(1.0f,-1.0f, 0.0f); 
     gl.glVertex3f(-1.0f,-1.0f, 0.0f); 
    } 
    gl.glEnd(); 

    gl.glFlush(); 

    rtri += 0.15f; 
    rquad -= 0.5f; 
} 

正如你可以看到,有一個gl.glLoadIdentity();定義的四前。如果這條線被評論,最終的程序會渲染第一個三角形旋轉,而四邊形則圍繞三角形旋轉,但四邊形也會自行旋轉。

如果該行沒有被註釋掉,四不是在所有的渲染,只有三角形渲染,用它定義的顏色和旋轉。

到目前爲止我看到的所有例子似乎都使用gl.glLoadIdentity();來恢復當前矩陣模式(GL_MODELVIEW)的默認狀態,但在這種情況下,其他事情似乎正在發生。

我已經gl.glPushMatrix();gl.glPopMatrix();測試每個繪圖操作前,周圍所有的繪圖代碼,有和沒有中間的gl.glLoadIdentity();,但似乎沒有任何幫助。

我檢查了其他的例子init和重塑方法,但一切似乎只是罰款:

@Override 
public void init(GLAutoDrawable drawable) { 
    final GL2 gl = drawable.getGL().getGL2(); 
    gl.glShadeModel(GL2.GL_SMOOTH); 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    gl.glClearDepth(1.0f); 
    gl.glEnable(GL2.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL2.GL_LEQUAL); 
    gl.glHint(GL2ES1.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST); 
} 

@Override 
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { 
    final GL2 gl = drawable.getGL().getGL2(); 
    if (height <= 0) { 
     height = 1; 
    } 
    float h = (float) width/(float) height; 
    gl.glMatrixMode(GL2.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    glu.gluPerspective(50.0f, h, 1.0, 1000.0); 
    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
} 

我想繼續學習的OpenGL,而使用Java(我喜歡的Java和很久以前,我不使用C++),但我應該是OpenGL的基礎知識,我不想繼續失去這樣的「基本」東西。謝謝大家的幫助,如果我的英文有錯,對不起。

回答

2

你的問題不是glLoadIdentity。您的問題是這樣的:

gl.glTranslatef(3.0f, 0.0f, 0.0f); 
gl.glRotatef(rquad, 1.0f, 0.0f, 0.0f); 

您在X方向上翻譯quad 3單位。好的,但它仍然有零的Z值。您的相機的Z值也爲零,因爲您在相機空間中操作。而且由於你的near-Z是1,你會剪下很多相機。

此外,還有一個事實,即,給你的50度視場,而且你把四3個單位在X方向的事實,它可能是關閉相機的右側。所以它只是在視野之外。

你需要的,如果你想看到它移動你的對象遠離相機。

+0

什麼英雄!非常感謝你!。這正是我需要的。 –