Android的OpenGL学习笔记(6)

                                                 Android的OpenGL学习笔记(6)

绘制多个3D模型,让你深刻体会3D空间,这里开启了深度测试功能:

Code:
  1. package com.droidnova.android.games.vortex;  
  2.   
  3. import java.nio.ByteBuffer;  
  4. import java.nio.ByteOrder;  
  5. import java.nio.FloatBuffer;  
  6. import java.nio.ShortBuffer;  
  7.   
  8. import javax.microedition.khronos.egl.EGLConfig;  
  9. import javax.microedition.khronos.opengles.GL10;  
  10.   
  11. import android.opengl.GLSurfaceView;  
  12. import android.util.Log;  
  13.   
  14. public class VortexRenderer implements GLSurfaceView.Renderer {  
  15.     private static final String LOG_TAG = VortexRenderer.class.getSimpleName();  
  16.   
  17.     // a raw buffer to hold indices allowing a reuse of points.  
  18.     private ShortBuffer _indexBuffer;  
  19.       
  20.     // a raw buffer to hold the vertices  
  21.     private FloatBuffer _vertexBuffer;  
  22.       
  23.     // a raw buffer to hold the colors  
  24.     private FloatBuffer _colorBuffer;  
  25.       
  26.     private int _nrOfVertices = 0;  
  27.   
  28.     private float _xAngle;  
  29.     private float _yAngle;  
  30.       
  31.     private float _width = 320f;  
  32.     private float _height = 480f;  
  33.       
  34.     @Override  
  35.     public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  36.         // preparation  
  37.         Log.i(LOG_TAG, "onSurfaceCreated()");  
  38.         gl.glMatrixMode(GL10.GL_PROJECTION);//透视模型  
  39.         float size = .01f * (float) Math.tan(Math.toRadians(45.0) / 2); //角度制转换为弧度制,然后除以2,这里不是取整。然后求正切值  
  40.         float ratio = _width / _height;  
  41.         // perspective:  
  42.         gl.glFrustumf(-size, size, -size / ratio, size / ratio, 0.01f, 100.0f);  
  43.         // orthographic:  
  44.         //gl.glOrthof(-1, 1, -1 / ratio, 1 / ratio, 0.01f, 100.0f);  
  45.         gl.glViewport(00, (int) _width, (int) _height);  
  46.         gl.glMatrixMode(GL10.GL_MODELVIEW);//视图模型  
  47.         gl.glEnable(GL10.GL_DEPTH_TEST);//允许深度测试  
  48.           
  49.     // define the color we want to be displayed as the "clipping wall"  
  50.     gl.glClearColor(0f, 0f, 0f, 1.0f);  
  51.       
  52.     // enable the differentiation of which side may be visible   
  53.     gl.glEnable(GL10.GL_CULL_FACE);  
  54.     // which is the front? the one which is drawn counter clockwise  
  55.     gl.glFrontFace(GL10.GL_CCW);  
  56.     // which one should NOT be drawn  
  57.     gl.glCullFace(GL10.GL_BACK);  
  58.       
  59.     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  
  60.     gl.glEnableClientState(GL10.GL_COLOR_ARRAY);  
  61.   
  62.     initTriangle();  
  63.     }  
  64.       
  65.     @Override  
  66.     public void onSurfaceChanged(GL10 gl, int w, int h) {  
  67.         Log.i(LOG_TAG, "onSurfaceChanged()");  
  68.         _width = w;  
  69.         _height = h;  
  70.         gl.glViewport(00, w, h);  
  71.     }  
  72.       
  73.     public void setXAngle(float angle) {  
  74.         _xAngle = angle;  
  75.     }  
  76.       
  77.     public float getXAngle() {  
  78.         return _xAngle;  
  79.     }  
  80.       
  81.     public void setYAngle(float angle) {  
  82.         _yAngle = angle;  
  83.     }  
  84.       
  85.     public float getYAngle() {  
  86.         return _yAngle;  
  87.     }  
  88.   
  89.     @Override  
  90.     public void onDrawFrame(GL10 gl) {  
  91.         // clear the color buffer and the depth buffer  
  92.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
  93.           
  94.         gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);  
  95.         gl.glColorPointer(4, GL10.GL_FLOAT, 0, _colorBuffer);  
  96.       
  97.         for (int i = 1; i <= 10; i++) {  
  98.             gl.glLoadIdentity();  
  99.             gl.glTranslatef(0.0f, -1f, -1.0f + -1.5f * i);  
  100.             // set rotation  
  101.             gl.glRotatef(-_xAngle, 1f, 0f, 0f);  
  102.             gl.glRotatef(-_yAngle, 0f, 1f, 0f);  
  103.             gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);  
  104.         }  
  105.     }  
  106.       
  107.     private void initTriangle() {  
  108.         float[] coords = {  
  109.                 -0.5f, -0.5f, 0.5f, // 0  
  110.                 0.5f, -0.5f, 0.5f, // 1  
  111.                 0f, -0.5f, -0.5f, // 2  
  112.                 0f, 0.5f, 0f, // 3  
  113.         };  
  114.         _nrOfVertices = coords.length;  
  115.           
  116.         float[] colors = {  
  117.                 1f, 0f, 0f, 1f, // point 0 red  
  118.                 0f, 1f, 0f, 1f, // point 1 green  
  119.                 0f, 0f, 1f, 1f, // point 2 blue  
  120.                 1f, 1f, 1f, 1f, // point 3 white  
  121.         };  
  122.           
  123.         short[] indices = new short[] {  
  124.                 013// rwg  
  125.                 021// rbg  
  126.                 032// rbw  
  127.                 123// bwg  
  128.         };  
  129.   
  130.         // float has 4 bytes, coordinate * 4 bytes  
  131.         ByteBuffer vbb = ByteBuffer.allocateDirect(coords.length * 4);  
  132.         vbb.order(ByteOrder.nativeOrder());  
  133.         _vertexBuffer = vbb.asFloatBuffer();  
  134.           
  135.         // short has 2 bytes, indices * 2 bytes  
  136.         ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);  
  137.         ibb.order(ByteOrder.nativeOrder());  
  138.         _indexBuffer = ibb.asShortBuffer();  
  139.           
  140.         // float has 4 bytes, colors (RGBA) * 4 bytes  
  141.         ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length * 4);  
  142.         cbb.order(ByteOrder.nativeOrder());  
  143.         _colorBuffer = cbb.asFloatBuffer();  
  144.           
  145.         _vertexBuffer.put(coords);  
  146.         _indexBuffer.put(indices);  
  147.         _colorBuffer.put(colors);  
  148.           
  149.         _vertexBuffer.position(0);  
  150.         _indexBuffer.position(0);  
  151.         _colorBuffer.position(0);  
  152.     }  
  153. }  

VortexView.java

Code:
  1. package com.droidnova.android.games.vortex;  
  2.   
  3. import android.content.Context;  
  4. import android.opengl.GLSurfaceView;  
  5. import android.view.MotionEvent;  
  6.   
  7. public class VortexView extends GLSurfaceView {  
  8.     private static final String LOG_TAG = VortexView.class.getSimpleName();  
  9.     private VortexRenderer _renderer;  
  10.     private float _x = 0;  
  11.     private float _y = 0;  
  12.       
  13.     public VortexView(Context context) {  
  14.         super(context);  
  15.         _renderer = new VortexRenderer();  
  16.         setRenderer(_renderer);  
  17.     }  
  18.       
  19.     public boolean onTouchEvent(final MotionEvent event) {  
  20.         if (event.getAction() == MotionEvent.ACTION_DOWN) {  
  21.             _x = event.getX();  
  22.             _y = event.getY();  
  23.         }  
  24.         if (event.getAction() == MotionEvent.ACTION_MOVE) {  
  25.             final float xdiff = (_x - event.getX());  
  26.             final float ydiff = (_y - event.getY());  
  27.             queueEvent(new Runnable() {  
  28.                 public void run() {  
  29.                     _renderer.setXAngle(_renderer.getXAngle() + ydiff);  
  30.                     _renderer.setYAngle(_renderer.getYAngle() + xdiff);  
  31.                 }  
  32.             });  
  33.             _x = event.getX();  
  34.             _y = event.getY();  
  35.         }  
  36.         return true;  
  37.     }  
  38. }  

你可能感兴趣的:(android,测试,buffer,float,colors)