gltranslatef没有按预期工作

时间:2014-05-19 14:47:18

标签: java android opengl-es

我的印象是gl.glTranslatef()通过传递给方法的值有效地移动了一个精灵(即如果我想要一个精灵移动2个像素,我会调用gl.glTranslate(2.0f,0.0f,0.0f);

但是如果我这样做,那么精灵仍然是静态的。但是如果我传入绝对位置(即调用gl.glTranslatef(52.0f,0.0f,0.0f)),我的精灵会按预期移动。然而它的起始位置是初始位置坐标(即如果我指定精灵从30,30开始,那么第一个绘制循环在62,30处绘制精灵,一旦第一帧完成,精灵就会按照我的预期移动。

发生了什么事?

这是我的精灵的绘制代码。

//重置模型视图矩阵         gl.glLoadIdentity();

    //drawing


    //bind the previously generated texture
    gl.glBindTexture(GL10.GL_TEXTURE_2D,this._texture);

    //point to our buffers
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    //set the face rotation
    gl.glFrontFace(GL10.GL_CW);

    gl.glPushMatrix();
    gl.glTranslatef(_position.x,_position.y,0.0f);//need to work out fraction of 1 that the position of the sprite represents

    //point to our vertex buffer
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);

    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, _textureBuffer);


    //draw the vertices as a triangle strip
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, _vertices.length / 3);
    gl.glPopMatrix();
    //disable the client state before leaving
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

请注意,这会传递绝对位置而不是额外的小动作。

简化以上内容。

如果我为gltranslatef指定静态输入

gl.glTranslatef(2.0F,2.0F,0.0F);

我希望矩阵每帧对角移动2个单位,但是如果我这样做矩阵,那么我的精灵就会停留在2,2位

如果我在每个帧上添加2个输入参数(即2,然后是4然后是6等),我的精灵会对角移动,但这不是我认为translatef工作的方式。

1 个答案:

答案 0 :(得分:0)

您案例中给定行为的罪魁祸首是glPushMatrix()glPopmatrix()。这两个调用每帧恢复原始状态(矩阵堆栈)。因此,每当你的原点保持不变,当你指定(2.0, 0.0,0.0)每个fram相对于世界起源时,你的精灵仍然是世界起源。删除这两个电话,看看神奇!