0

这已经被问过很多次了,我已经在互联网上阅读了大量关于它的帖子和论坛,但我就是无法让一个物体围绕它自己的轴旋转。我有几个这样绘制的对象:

 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 轴旋转。

4

2 回答 2

0

“OpenGL反向执行命令”,意味着它从右而不是左乘以变换矩阵。这是什么意思?

想象一下转换 A 和 B:

y = Ax

转换并x产生Ay

这相当于:

// 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();
于 2012-02-22T17:04:37.810 回答
0

我不确定您是否定期更新“角度”变量。如果你不是,那么就不会有任何轮换。伪代码如下。您可以使用 gluttimerfunc 定期更新变量。

for(每个opengl循环)

角度+=5.0f

萨蒂什

于 2012-02-23T09:18:21.537 回答