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

1. 前言

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


2. 参考资料

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

如何用触屏方式点击魔方(射线拾取原理)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 方法 ),魔方的雏形就出来了。



发布了38 篇原创文章 · 获赞 4 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/tomatozq/article/details/7617764
今日推荐