«OpenGL выполняет команды в обратном порядке», это означает, что он умножает матрицу преобразования справа, а не слева. Что это значит?
Представьте себе преобразование A и B:
y = Ax
преобразует x
на A
и дает y
Это эквивалентно:
// sudo code:
glA()
glDraw(x)
Теперь, обычно, в программировании вы думаете, что получаете преобразования в том порядке, в котором вы их пишете. Итак, вы думаете , что
glA()
glB()
glDraw(x)
даст вам
y = BAx
но это не так . Вы на самом деле получаете:
y = ABx
Это означает, что сначала B
применяется к x
, а затем A
к результату.
Поставь на английский, взгляни на этот пример:
glScalef(...) // third, scale the whole thing
glTranslatef(...) // second, translate it somewhere
glRotatef(...) // first, rotate the object (or course,
// around its own axes, because the object is at origin)
glDrawElements(...) // draw everything at origin
Итак, вам нужно написать:
// When everything is drawn, move them to destination:
gl.glTranslatef(destination[0], destination[1], destination[2]);
// For every object, rotate it the way it should, then restore transformation matrix
// object: RLt
gl.glPushMatrix();
gl.glRotatef(angle, 0.0f, 1.0f, 0.0f);
texture.bind(gl);
gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, textureRLt);
gl.glNormalPointer(GL2.GL_FLOAT, 0, normalRLt);
gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vertexRLt);
gl.glDrawElements(GL2.GL_TRIANGLES, countI, GL2.GL_UNSIGNED_SHORT, indexRLt);
gl.glPopMatrix();
// object: RLt2
gl.glPushMatrix();
gl.glRotatef(angle2, 0.0f, 1.0f, 0.0f);
texture.bind(gl);
gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, textureRLt2);
gl.glNormalPointer(GL2.GL_FLOAT, 0, normalRLt2);
gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vertexRLt2);
gl.glDrawElements(GL2.GL_TRIANGLES, countI2, GL2.GL_UNSIGNED_SHORT, indexRLt2);
gl.glPopMatrix();