在OpenGL中推/弹矩阵和单个对象围绕其自己的轴旋转

时间:2012-02-22 16:57:09

标签: opengl glrotate

之前已经多次询问这个问题,而且我已经在互联网上阅读了很多关于它的帖子和论坛,但我无法让一个对象围绕它自己的轴旋转。 我有几个这样的对象:

 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 :(得分:0)

“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();

答案 1 :(得分:0)

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

for(每个opengl循环)

角度+ = 5.0F

萨蒂什南比亚