GLU.gluLookAt в Java Привязки OpenGL, похоже, ничего не делают - PullRequest
4 голосов
/ 24 февраля 2011

Я уже проверил другие вопросы по этой теме, и их решения не помогли мне.Я немного растерялся.У меня есть следующие функции в моей реализации 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 Ответ

6 голосов
/ 24 февраля 2011

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

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

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), весьма вероятно, что код делает то, что вы просили.

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

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

Предполагается, что вы используете 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.После того, как вы понимаете пространство координат объекта, пространство глазных координат и пространство координат клипа, вышеприведенное должно стать ясным.Также поэкспериментируйте с небольшими тестовыми программами.Если у вас возникают проблемы с получением правильных преобразований в основном проекте приложения, может быть полезно написать небольшой фрагмент кода, который пытается воспроизвести проблему с более простой геометрией.

...