1. 前言
在看见apidemo中自带的魔方例子后就一直想做一个可以触摸旋转的魔方,没事可以玩玩,于是在网上查找了大量的资料,根据自己的理解把魔方例子进行了改良,增加了贴图、触摸扭转、每帧处理时间的显示。代码在开发总结(四)后附加,效果具体见下图:
2. 参考资料
如何用触屏方式点击魔方(射线拾取原理)http://www.ophonesdn.com/article/show/164
Android OpenGL射线拾取&手势旋转 http://vaero.blog.51cto.com/4350852/790620
3. 实现原理分析
3.1. 画立方体
将魔方由9个小方块Cube组成,其中每个方块包含8个顶点(GLVertex)6个面(GLFace),将8个顶点放在Cube的mVertexList字段中,在每个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 方法 ),魔方的雏形就出来了。