Невозможно использовать glLoadIdentity, как ожидалось, после перевода в JOGL

Я только начинаю работать с JOGL и кое-что не могу сделать: пример базового рисования и вращения в учебники NeHe, и все работает просто отлично, за исключением 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;
}

Как видите, перед определением Quad стоит gl.glLoadIdentity();. Если эту строку закомментировать, окончательная программа визуализирует вращение первого треугольника и перемещение четырехугольника вокруг треугольника, но у четырехугольника тоже есть собственное вращение.

Если эта строка НЕ ​​прокомментирована, четырехугольник вообще не визуализируется, а визуализируется только треугольник с определенными для него цветами и поворотом.

Все примеры, которые я видел до сих пор, используют gl.glLoadIdentity(); для восстановления состояния по умолчанию для текущего матричного режима (GL_MODELVIEW), но в этом случае, похоже, происходит что-то еще.

Я тестировал gl.glPushMatrix(); и gl.glPopMatrix(); перед каждой операцией рисования, окружая весь код рисования, с gl.glLoadIdentity(); в середине и без него, но, похоже, ничего не помогает.

Я проверил метод инициализации и изменения формы других примеров, но все выглядит просто отлично:

@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, и я бы не стал этого делать. Мне нравится упускать из виду такую ​​«базовую» вещь. Спасибо всем за вашу помощь, и извините, если мой английский имеет ошибки.


person David    schedule 30.09.2011    source источник


Ответы (1)


Ваша проблема не в glLoadIdentity. Ваша проблема заключается в следующем:

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

Вы переводите четверку на 3 единицы в направлении X. Хорошо, но у него все еще есть Z, равный нулю. Z вашей камеры также равна нулю, поскольку вы работаете в пространстве камеры. И так как ваш почти Z равен 1, вы собираетесь вырезать большую часть камеры.

Плюс, есть тот факт, что, учитывая ваше FOV 50 градусов, и тот факт, что вы поместили Quad 3 единицы в направлении X, он, вероятно, находится справа от камеры. Так что это просто вне поля зрения.

Вам нужно отодвинуть объект от камеры, если вы хотите его увидеть.

person Nicol Bolas    schedule 30.09.2011
comment
Какой герой! Большое спасибо!!. Это именно то, что мне было нужно. - person David; 30.09.2011