By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处
通过之前文章--概念篇的学习,我们今天编写一个简单的入门程序,实现一个不断绕x轴,y轴旋转的彩色立方体,效果如下:

android 3D系列之入门实践篇_第1张图片

在Android中我们使用GLSurfaceView来显示OpenGL视图,GLSurfaceView:是其中很重要的一个类,此类位于android.opengl包下,用于管理是一块可以是复合视图机器人系统的内存的特殊的曲面。管理一个使表面呈现 OpenGL 的 EGL 显示。接受一个用户提供输入Render对象进行显示。从 UI 线程实现一个专用线程渲染界面实现3D性能。支持按需要和连续的呈现。 包装、 跟踪,和检查 OpenGL 渲染器调用的错误。所以首先我们需要创建一个GLSurfaceView。

public class mainActivity extends Activity {CubeRenderer mCubeRenderer;  //我们自定义的立方体Renderer@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉标题GLSurfaceView GLView = new GLSurfaceView(this); //创建一个GLSurfaceView       mCubeRenderer = new CubeRenderer();GLView.setRenderer(mCubeRenderer);setContentView(GLView);}}

接下来我们的主要工作就是去创建一个继承Renderer接口的CubeRenderer。Renderer是一个专门用来渲染3D的接口。继承它,我们需要重载以下方法:

public void onDrawFrame(GL10 gl)

{

//渲染的绘图操作,重绘时调用

}

public void onSurfaceChanged(GL10 gl, int width, int height)

{

//视窗改变时调用,通常在此设置视窗范围以及透视,投影范围

}

public void onSurfaceCreated(GL10 gl, EGLConfig config)

{

//创建时调用,通常在此进行初始化设置

}

以下是我们CubeRenderer的完整代码:

public class CubeRenderer implements Renderer {float box[] = new float[] {// FRONT-0.5f, -0.5f,  0.5f, 0.5f, -0.5f,  0.5f,-0.5f,  0.5f,  0.5f, 0.5f,  0.5f,  0.5f,// BACK-0.5f, -0.5f, -0.5f,-0.5f,  0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f,  0.5f, -0.5f,// LEFT-0.5f, -0.5f,  0.5f,-0.5f,  0.5f,  0.5f,-0.5f, -0.5f, -0.5f,-0.5f,  0.5f, -0.5f,// RIGHT 0.5f, -0.5f, -0.5f, 0.5f,  0.5f, -0.5f, 0.5f, -0.5f,  0.5f, 0.5f,  0.5f,  0.5f,// TOP-0.5f,  0.5f,  0.5f, 0.5f,  0.5f,  0.5f, -0.5f,  0.5f, -0.5f, 0.5f,  0.5f, -0.5f,// BOTTOM-0.5f, -0.5f,  0.5f,-0.5f, -0.5f, -0.5f, 0.5f, -0.5f,  0.5f, 0.5f, -0.5f, -0.5f,};FloatBuffer cubeBuff;float xrot = 0.0f;float yrot = 0.0f;/** * 将float数组转换存储在字节缓冲数组 * @param arr * @return */public FloatBuffer makeFloatBuffer(float[] arr) {ByteBuffer bb = ByteBuffer.allocateDirect(arr.length * 4);//分配缓冲空间,一个float占4个字节bb.order(ByteOrder.nativeOrder()); //设置字节顺序, 其中ByteOrder.nativeOrder()是获取本机字节顺序FloatBuffer fb = bb.asFloatBuffer(); //转换为float型fb.put(arr);        //添加数据fb.position(0);      //设置数组的起始位置return fb;}public CubeRenderer() {// TODO Auto-generated constructor stubcubeBuff = makeFloatBuffer(box);//转换float数组}protected void init(GL10 gl) {gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//设置清屏时背景的颜色,R,G,B,Agl.glEnable(GL10.GL_DEPTH_TEST); //启用深度缓存gl.glEnable(GL10.GL_CULL_FACE);  //启用背面剪裁gl.glClearDepthf(1.0f);    // 设置深度缓存值gl.glDepthFunc(GL10.GL_LEQUAL);  // 设置深度缓存比较函数,GL_LEQUAL表示新的像素的深度缓存值小于等于当前像素的深度缓存值(通过gl.glClearDepthf(1.0f)设置)时通过深度测试gl.glShadeModel(GL10.GL_SMOOTH);// 设置阴影模式GL_SMOOTH}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {// TODO Auto-generated method stubinit(gl);}@Overridepublic void onSurfaceChanged(GL10 gl, int w, int h) {// TODO Auto-generated method stubgl.glViewport(0, 0, w, h); //设置视窗gl.glMatrixMode(GL10.GL_PROJECTION); // 设置投影矩阵gl.glLoadIdentity();  //设置矩阵为单位矩阵,相当于重置矩阵GLU.gluPerspective(gl, 45.0f, ((float) w) / h, 0.1f, 10f);//设置透视范围}@Overridepublic void onDrawFrame(GL10 gl) {// TODO Auto-generated method stubgl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 清除屏幕和深度缓存gl.glMatrixMode(GL10.GL_MODELVIEW);   //切换至模型观察矩阵gl.glLoadIdentity();// 重置当前的模型观察矩阵GLU.gluLookAt(gl, 0, 0, 3, 0, 0, 0, 0, 1, 0);//设置视点和模型中心位置gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeBuff);//设置顶点数据gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glRotatef(xrot, 1, 0, 0);  //绕着(0,0,0)与(1,0,0)即x轴旋转gl.glRotatef(yrot, 0, 1, 0);gl.glColor4f(1.0f, 0, 0, 1.0f);   //设置颜色,红色gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);  //绘制正方型FRONT面gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4);gl.glColor4f(0, 1.0f, 0, 1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4);gl.glColor4f(0, 0, 1.0f, 1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4);xrot += 1.0f;yrot += 0.5f;}}

源码工程,下载地址: http://download.csdn.net/source/3566635


  
  
  
  
  
  
  
  
  
                                                                                             

更多相关文章

  1. 管理图片缓存
  2. Android笔记二十.Android绘图深度解析
  3. Android事件分发机制深度解析(View篇)
  4. Retrofit 风格的 RxCache及其多种缓存替换算法
  5. Android 实现清除缓存
  6. Android 开发之自定义三级缓存
  7. Android WebView缓存机制详解
  8. picasso-强大的Android图片下载缓存库
  9. android强大的图片下载和缓存库Picasso

随机推荐

  1. AngularJS我在哪里可以访问加载的控制器
  2. 动画在画布中移动图像
  3. 掌握JavaScript中的事件监听
  4. JavaScript中的对象描述符
  5. 在JavaScript中访问PHP变量[重复]
  6. JQuery Image滑块从json加载图片
  7. 如何在sap.m.Datepicker中设置与上一行相
  8. 由浅到深的分析Javascript OO之写类方式
  9. JavaScript数组操作函数方法详解
  10. 在图像映射中的背景图像