我的印象是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工作的方式。
答案 0 :(得分:0)
您案例中给定行为的罪魁祸首是glPushMatrix()
和glPopmatrix()
。这两个调用每帧恢复原始状态(矩阵堆栈)。因此,每当你的原点保持不变,当你指定(2.0, 0.0,0.0)
每个fram相对于世界起源时,你的精灵仍然是世界起源。删除这两个电话,看看神奇!