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