Android 3D立方体

简单的入门程序,实现一个不断绕x轴,y轴旋转的彩色立方体
在Android中我们使用GLSurfaceView来显示OpenGL视图,GLSurfaceView:是其中很重要的一个类,此类位于android.opengl包下,用于管理是一块可以是复合视图机器人系统的内存的特殊的曲面。管理一个使表面呈现 OpenGL 的 EGL 显示。接受一个用户提供输入Render对象进行显示。从 UI 线程实现一个专用线程渲染界面实现3D性能。支持按需要和连续的呈现。 包装、 跟踪,和检查 OpenGL 渲染器调用的错误。所以首先我们需要创建一个GLSurfaceView。
##ReadMore##
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.Window;

public class mainActivity extends Activity {

 CubeRenderer mCubeRenderer;
 /** Called when the activity is first created. */
 @Override
 public 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的接口。继承它,我们需要重载以下方法:
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLU;
import android.opengl.GLSurfaceView.Renderer;

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 stub
  cubeBuff = makeFloatBuffer(box);//转换float数组
 }
 
 
 protected void init(GL10 gl) {
  gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//设置清屏时背景的颜色,R,G,B,A
  
  gl.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
 }
 
 public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  // TODO Auto-generated method stub
  init(gl);
 }
 
 public void onSurfaceChanged(GL10 gl, int w, int h) {
  // TODO Auto-generated method stub
  gl.glViewport(0, 0, w, h); //设置视窗
  gl.glMatrixMode(GL10.GL_PROJECTION); // 设置投影矩阵
  gl.glLoadIdentity();  //设置矩阵为单位矩阵,相当于重置矩阵  
  GLU.gluPerspective(gl, 45.0f, ((float) w) / h, 0.1f, 10f);//设置透视范围 
 }
 
 public void onDrawFrame(GL10 gl) {
  // TODO Auto-generated method stub
  gl.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://www.linuxidc.com/Linux/2011-09/43751.htm

Related Articles

Quote Of The Day