2011-09-30 2 views
2

방금 ​​JOGL로 시작 했으므로 수행 할 수없는 작업이 있습니다. 기본 도면과 회전의 예가 NeHe tutorials이고 모든 것이 작동합니다 첫 번째 삼각형 이후와 다음 쿼드 이전에 사용 된 glLoadIdentity();을 제외하고는 괜찮습니다. JOGL 코드는 다음입니다 : 당신이 볼 수 있듯이 쿼드가 정의되기 전에JOGL에서 번역 후 예상대로 glLoadIdentity를 사용할 수 없습니다

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.glLoadIdentity();의 존재 여부에 관계없이 각 드로잉 작업을 수행하기 전에 gl.glPushMatrix();gl.glPopMatrix();으로 테스트했지만 아무 것도 도움이되지 않습니다.

나는 다른 예 '초기화 및 바꿀 방법을 확인했지만, 모든 것이 잘 보인다

@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을 학습 유지하고 싶은 자바를 사용하는 동안 (내가 자바를 사랑하고 싶지만 오래전에 저는 C++을 사용하지 않았습니다), OpenGL의 기본에 있어야하고, 그런 "기본적인"것을 놓치고 싶지 않습니다. 도와 줘서 고마워, 내 영어에 오류가 생겨서 미안해.

답변

2

문제가 glLoadIdentity이 아닙니다. 문제는 다음과 같습니다.

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

X 방향으로 4 칸 3 단위를 번역합니다. 좋아요,하지만 여전히 Z가 0입니다. 카메라도 카메라 공간에서 작동하므로 Z가 0입니다. 그리고 가까운 Z 값이 1이기 때문에 많은 카메라를 잘라낼 것입니다.

플러스 50 도의 FOV와 X 방향으로 쿼드 3 단위를 넣었을 때 카메라 오른쪽에있는 것 같습니다. 그래서 그것은 단순히 시야에서 벗어났습니다.

보고 싶으면 카메라에서 멀리 떨어져 있어야합니다.

+0

무슨 영웅!, 대단히 감사합니다 !! !! 그것이 내가 필요한 것입니다. –

관련 문제