Матрица Push / Pop и вращение отдельного объекта вокруг своей оси в OpenGL - PullRequest
0 голосов
/ 22 февраля 2012

Об этом уже много, много раз спрашивали, и я читал об этом множество постов и форумов в Интернете, но я просто не могу заставить один объект вращаться вокруг своей оси. У меня есть несколько объектов, нарисованных так:

 gl.glMatrixMode(GL2.GL_MODELVIEW);
       gl.glLoadIdentity();   
 .....
 gl.glPushMatrix();
       gl.glRotatef(angle, 0.0f, 1.0f, 0.0f);
       gl.glTranslatef(0.0f, 0.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();

И это нарисовано правильно, с применением всех текстур и нормалей.

Я знаю, что OpenGL выполняет команды в обратном порядке, поэтому glRotatef стоит первым. Также я знаю, что все повороты вокруг источника, поэтому мне нужно перевести объект в это начало (не то, что я думаю, что должен, потому что «ручка» уже находится в источнике, потому что я сохраняю матрицу перед рисованием каждого объекта и поп это потом). Это что-то с glDrawElements? Что-то не так.

Любая помощь будет принята с благодарностью. :)

Редактировать : я вижу, как объекты вращаются вокруг главной оси x, но я хочу, чтобы они вращались вокруг своей локальной оси x.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2012

Я не уверен, что вы периодически обновляете переменную 'angle'.Если нет, то вращения не будет.Псевдокод ниже.Вы можете использовать gluttimerfunc для периодического обновления переменной.

для (каждого цикла opengl)

angle + = 5.0f

Satish

0 голосов
/ 22 февраля 2012

«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();
...