Как вращать вокруг мировой координаты, после сложного преобразования - PullRequest
1 голос
/ 13 апреля 2019

Как вращать объект вокруг мировой оси? Объект был преобразован (повернуть, перевести), и матрица была сдвинута. Могу ли я сначала загрузить матрицу, а затем умножить верхнюю матрицу в стеке 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();
}

Спасибо

...