我正在按照谷歌提供的OpenGL ES旋转示例来旋转我的Android应用程序中的简单正方形(不是立方体),例如这段代码:
gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f); //X
gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f); //Y
gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f); //Z
如果您只围绕一个轴旋转,则可以正常工作。
但是,如果您先围绕一个轴旋转,然后再围绕另一个轴旋转,则旋转效果不佳。我的意思是旋转会在基础(全局)坐标系的轴上进行,而不是正方形自己的坐标系中。
使用代码编辑器为 Shahbaz 编辑:
public void onDrawFrame(GL10 gl) {
//Limpiamos pantalla y Depth Buffer
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
//Dibujado
gl.glTranslatef(0.0f, 0.0f, z); //Move z units into the screen
gl.glScalef(0.8f, 0.8f, 0.8f); //Escalamos para que quepa en la pantalla
//Rotamos sobre los ejes.
gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f); //X
gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f); //Y
gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f); //Z
//Dibujamos el cuadrado
square.draw(gl);
//Factores de rotación.
xrot += xspeed;
yrot += yspeed;
}
正方形的绘制:
public void draw(GL10 gl) {
gl.glFrontFace(GL10.GL_CCW);
//gl.glEnable(GL10.GL_BLEND);
//Bind our only previously generated texture in this case
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
//Point to our vertex buffer
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
//Enable vertex buffer
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
//Draw the vertices as triangle strip
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
//gl.glDisable(GL10.GL_BLEND);
}
顶点缓冲区数值:
private FloatBuffer vertexBuffer;
private float vertices[] =
{
-1.0f, -1.0f, 0.0f, //Bottom Left
1.0f, -1.0f, 0.0f, //Bottom Right
-1.0f, 1.0f, 0.0f, //Top Left
1.0f, 1.0f, 0.0f //Top Right
};
.
.
.
public Square(int resourceId) {
ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
vertexBuffer = byteBuf.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
.
.
.
gluLookAt
。 - Shahbazxrot
、yrot
和zrot
参数找到一个向量,并围绕该向量旋转对象。这并不是一件简单的事情,除了纯粹的数学趣味之外,我不建议实际去做这个。就像我说的那样,gluLookAt
是最简单的方法。无论如何,即使你更愿意手动计算,最好还是保存其他参数。与使用gluLookAt
类似,你可以保持一个指向球体中心的表面点,并使用它生成变换矩阵。 - Shahbaz+roll, +pitch, +roll, +yaw, -pitch
,它们可以聚合为+2*roll, +yaw
。应用前5个操作的效果与应用后2个操作的效果不同。然而,我认为第二种方法(聚合输入,一次应用)实际上是任何人都期望从模拟器中得到的结果。 - Shahbaz