Я только начинаю с 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();
впосередине, но, похоже, ничего не помогает.
Я проверил метод init и изменение формы других примеров, но все выглядит просто отлично:
@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, и я не хотел бы пропуститьг такая "базовая" вещь.Спасибо всем за помощь, и извините, если в моем английском есть ошибки.