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