GLU.gluLookAt в Java Привязки OpenGL, похоже, ничего не делают

Я уже проверил другие вопросы по этой теме, и их решения не помогли мне. Я немного растерялся. У меня есть следующие функции в моей реализации GLEventListener.

public void init(GLAutoDrawable gl) {
    GL2 gl2 = gl.getGL().getGL2();

    gl2.glMatrixMode(GL2.GL_PROJECTION);
    gl2.glLoadIdentity();
    GLU glu = GLU.createGLU(gl2);
    glu.gluPerspective(45.0f, 1, 0.1f,100.0f);
    gl2.glMatrixMode(GL2.GL_MODELVIEW);
    gl2.glLoadIdentity();
    gl2.glViewport(0, 0, width, height);
    gl2.glEnable(GL.GL_DEPTH_TEST);
}

private void render(GLAutoDrawable drawable) {

    GL2 gl = drawable.getGL().getGL2();
    GLU glu = GLU.createGLU(gl);

    gl.glClear(GL.GL_COLOR_BUFFER_BIT);
    gl.glMatrixMode(GL2.GL_MODELVIEW);
    gl.glLoadIdentity();
    glu.gluLookAt(5,  0, 20, 
                  0, 30,  0, 
                  0,  1,  0);

    gl2.glPushMatrix();
    gl2.glClear( GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT );                
    gl2.glLoadIdentity();
    gl2.glTranslatef(x, y, z);        
    gl2.glBegin( GL2.GL_QUADS );
        gl2.glColor3f( 1, 0, 0 );

        //24 glVertex3f calls & some colour changes go here.
        gl2.glVertex3f(...)

    gl2.glEnd();
    gl2.glPopMatrix();

    gl.glFlush();
}

Неважно, какие значения я положил в матрицу gluLookAt(), вид не меняется. Я все еще в конечном итоге смотрю на то же лицо куба.

Есть идеи?

Спасибо

1 ответ

Решение

РЕДАКТИРОВАТЬ: Отвечая на редактирование в исходном вопросе. Оставляя оригинальный текст ниже, потому что люди, кажется, считают его полезным.

Я думаю, что ваша проблема в вашем коде рисования куба. Проверьте комментарий ниже: glLoadIdentity call делает именно то, что вы ожидаете - вынуждая куб оказаться перед вами:

gl2.glPushMatrix();     
gl2.glClear( GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT );
/** Try removing the following glLoadIdentity call below.
  * That call was blowing out the MODELVIEW matrix - it's removing your 
  * gluLookAt call and returning to the identity.
  * As a result, the cube will always be right there in front of you.
  */
// gl2.glLoadIdentity();
gl2.glTranslatef(x, y, z);
gl2.glBegin( GL2.GL_QUADS );
gl2.glColor3f( 1, 0, 0 ); //24 glVertex3f calls & some colour changes go here.
gl2.glVertex3f(...)
gl2.glEnd();
gl2.glPopMatrix(); 

Вот очень быстрое объяснение того, что будут делать связанные звонки. Смотрите документацию для получения дополнительной информации:

gl2.glPushMatrix(); // This preserves current MODEL_VIEW matrix so you can get back here.
                    // Think of it as a checkpoint save in a game.
                    // Most of your objects will be wrapped in push and pop.
gl2.glLoadIdentity(); // This erases the MODEL_VIEW and replaces it with an identity.
                      // This un-does your previous gluLookAt call.  You will rarely use
                      // this inside an object (but it's not impossible).
                      // Does not apply here so don't use.
gl2.glTranslatef(x, y, z); // This is what puts your object out in space for you to find
                           // as opposed to putting it at the origin.  Most objects will
                           // have a translate (and likely a rotate as well).
                           // Note that the order of operations matters:
                           // translate and then rotate != rotate and then translate.
// QUAD strip code with vertices and colors - you're okay with these.
gl2.glPopMatrix(); // This brings back the MODEL_VIEW that you originally saved by pushing
                   // it.

Самое замечательное в матричном коде в OpenGL состоит в том, что как только вы получите набор примеров кода, который вы понимаете, вы всегда будете иметь его в качестве справочного материала. Когда я перешел с IrisGL на OpenGL в тот день, мне потребовалось немного времени, чтобы перенести свои утилиты, и тогда я никогда не оглядывался назад.

ОРИГИНАЛ: Вам нужно добавить код рисования куба - если вы помещаете куб в окрестности (0, 30, 0), весьма вероятно, что код выполняет то, о чем вы его просили.

Проверяя FAQ по OpenGL, есть конкретный вопрос и ответ, который, вероятно, имеет отношение к тому, что вы делаете: 8.080 Почему не работает gluLookAt? Я собираюсь процитировать весь ответ, так как действительно нет хорошего перерыва, но, пожалуйста, посетите FAQ по OpenGL, ответ, вероятно, там:

Обычно это вызвано неправильными преобразованиями.

Предполагая, что вы используете gluPerspective () в стеке матриц проекции с zNear и zFar в качестве третьего и четвертого параметров, вам нужно установить gluLookAt в стеке матриц ModelView и передать параметры, чтобы ваша геометрия находилась между zNear и zFar.

Обычно лучше всего поэкспериментировать с простым фрагментом кода, когда вы пытаетесь понять преобразования просмотра. Допустим, вы пытаетесь взглянуть на единичную сферу с центром в начале координат. Вы хотите настроить свои преобразования следующим образом:

 glMatrixMode(GL_PROJECTION);
 glLoadIdentity(); 
 gluPerspective(50.0, 1.0, 3.0, 7.0); 
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity(); 
 gluLookAt(0.0, 0.0, 5.0,
           0.0, 0.0, 0.0,
           0.0, 1.0, 0.0);

Важно отметить, как преобразования Projection и ModelView работают вместе.

В этом примере проекционное преобразование устанавливает поле зрения в 50,0 градусов с соотношением сторон 1,0. Плоскость отсечения zNear составляет 3,0 единицы перед глазом, а плоскость отсечения zFar - 7,0 единиц перед глазом. Это оставляет Z объем расстояния 4,0 единиц, достаточно места для сферы юнитов.

Преобразование ModelView устанавливает положение глаза на (0,0, 0,0, 5,0), а точка наблюдения - это начало координат в центре нашей единичной сферы. Обратите внимание, что положение глаза составляет 5,0 единиц от точки обзора. Это важно, потому что расстояние 5,0 единиц перед глазом находится в середине тома Z, который определяет преобразование проекции. Если бы вызов gluLookAt () поместил глаз в (0.0, 0.0, 1.0), он бы выдал расстояние 1,0 до начала координат. Этого недостаточно, чтобы включить сферу в объем представления, и она будет обрезана плоскостью отсечения zNear.

Точно так же, если вы поместите глаз в (0,0, 0,0, 10,0), расстояние 10,0 от точки обзора приведет к тому, что сфера будет находиться на расстоянии 10,0 единиц от глаза и далеко за плоскостью отсечения zFar, расположенной на уровне 7,0 единиц.

Если это вас смутило, ознакомьтесь с преобразованиями в Красной книге OpenGL или Спецификации OpenGL. После того, как вы понимаете пространство координат объекта, пространство глазных координат и пространство координат клипа, вышеприведенное должно стать ясным Также поэкспериментируйте с небольшими тестовыми программами. Если у вас возникают проблемы с получением правильных преобразований в основном проекте приложения, может быть полезно написать небольшой фрагмент кода, который пытается воспроизвести проблему с более простой геометрией.

Другие вопросы по тегам