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