Как вращать объект вокруг мировой оси? Объект был преобразован (повернуть, перевести), и матрица была сдвинута.
Могу ли я сначала загрузить матрицу, а затем умножить верхнюю матрицу в стеке opengl?
Я знаю, что порядок операции opengl инвертирован,
например:
gl.glLoadIdentity(); // E
gl.glTranslatef(1, 0, 0); // M
gl.glRotatef(60, 0, 0, 1); // N
Куб будет сначала вращаться, а затем переводиться.
И я знаю вот почему: преобразование - MNv, равно M (Nv), и оно соответствует реализации "конвейера opengl".
Затем я хочу, чтобы объект вращался на 60 градусов по мировой оси Z (0,0,1), я могу добавить этот код перед первым оператором преобразования:
gl.glLoadIdentity(); // E
gl.glRotatef(45, 0, 0, 1); // this is newly added
gl.glTranslatef(1, 0, 0); // M
gl.glRotatef(60, 0, 0, 1); // N
Но объект подвергся сложному преобразованию, поэтому я должен сохранить матрицу преобразования в стеке:
gl.glLoadIdentity(); // E
gl.glTranslatef(1, 0, 0); // M
gl.glRotatef(60, 0, 0, 1); // N
....
gl.glPushMatrix();
Затем я выталкиваю эту матрицу и умножаю матрицу вращения (которая вращается вокруг мировой координаты / оси). Но если я glPop, то glRotate (или glMul), порядок неправильный.
Можно ли сначала загрузить матрицу вращения, а затем умножить верхнюю матрицу в стеке?
К сожалению, я программирую на Android, и у меня нет реализации "glGetFolat" в GL10, поэтому я не вижу матрицу результатов моего сложного преобразования. Я попытался привести интерфейс GL10 к GL11, у которого есть метод "glGetFolat", но он всегда возвращает 0. Я искал в Интернете, какой-то ответ - ОС моего устройства не поддерживает GL11.
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// dither is enabled by default, we don't need it
gl.glDisable(GL10.GL_DITHER);
// clear screen in white
gl.glClearColor(1, 1, 1, 1);
// load a complex transform
gl.glLoadIdentity();
gl.glTranslatef(0, 0, -3.0f);
gl.glMultMatrixf(mComplexMatrix, 0);
gl.glPushMatrix();
}
public void onDrawFrame(GL10 gl) {
// clear screen
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// set-up modelview matrix
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPopMatrix();
gl.glRotatef(mIncrement, 0, 0, 1); // of course it's wrong
gl.glPushMatrix();
// draw our object
gl.glPopMatrix();
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
mCube.draw(gl);
gl.glPushMatrix();
}
Спасибо