基于Android opengles的魔方开发总结(一)

来源:互联网 发布:淘宝买家恶意大量退货 编辑:程序博客网 时间:2024/06/05 01:52

1. 前言

在看见apidemo中自带的魔方例子后就一直想做一个可以触摸旋转的魔方,没事可以玩玩,于是在网上查找了大量的资料,根据自己的理解把魔方例子进行了改良,增加了贴图、触摸扭转、每帧处理时间的显示。代码在开发总结(四)后附加,效果具体见下图:


2. 参考资料

魔方开发简明指导 http://www.apkbus.com/android-2756-1-1.html

魔方贴图http://www.asiteof.me/2011/01/android_opengl/

如何用触屏方式点击魔方(射线拾取原理)http://www.ophonesdn.com/article/show/164

Android OpenGL射线拾取&手势旋转 http://vaero.blog.51cto.com/4350852/790620

3. 实现原理分析

3.1. 画立方体

将魔方由9个小方块Cube组成,其中每个方块包含8个顶点(GLVertex6个面(GLFace),将8个顶点放在CubemVertexList字段中,在每个GLFace中放置要绘制的顶点顺序和面的颜色、及贴图。

魔方按照以下流程绘制:

1.首先在onDrawFrame方法中执行(注意GLSurfaceView 的渲染模式有两种,一种是连续不断的更新屏幕,另一种为on-demand ,只有在调用requestRender() 在更新屏幕。 缺省为RENDERMODE_CONTINUOUSLY 持续刷新屏幕)。 

mWorld.draw(gl);

2.GLWorld类中的draw方法为:

//设置小方块的顶点数组

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);

for(GLShape shape : mShapeList) {

shape.draw(gl);

}

3.GLShape类中的draw方法为:

for (GLFace face : mFaceList) {

face.draw(gl);

}

GLFace类中的draw方法为:

//启用顶点数组

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

//打开 忽略

后面设置

gl.glEnable(GL10.GL_CULL_FACE);

//设置逆时针方法为面的

前面 如果画图索引顺序不是逆时针反向则无法看见

gl.glFrontFace(GL10.GL_CCW);

//明确指明忽略背面

gl.glCullFace(GL10.GL_BACK);

//不画被

遮挡的图形部分

gl.glEnable(GL10.GL_DEPTH_TEST); 

//获取面的绘制顺序

    

ShortBuffer indicesBuffer = face.getIndicesBuffer();

indicesBuffer.position(0);

  

  //每相邻三个顶点组成一个三角形

gl.glDrawElements(GL10.

GL_TRIANGLE_STRIP,4, GL10.GL_UNSIGNED_SHORT, indicesBuffer);

在设置好每个方块的坐标和面的绘制顺序后(具体见代码

KubeActivity类中的makeGLWorld方法),魔方的雏形就出来了。



原创粉丝点击