Android高级进阶六 Android OpenGL旋转多边形

最新版本;Android高级进阶六 Android OpenGL旋转多边形

         上一节我们已经改三角形和四边形上色了,具体上色方案可以查看:Android高级进阶五 Android OpenGL给多边形着色。这一篇文章我们接着对代码进行修改,增加多边形的旋转功能,使其看起来更具动感。

        先上效果图:

        从上面图片可以看出三角形沿y轴、四边形沿x轴旋转,下面看看代码是怎么实现的。

        首先添加两个变量来控制三角形、四边形的旋转,这个采用浮点类型的变量就可以非常精确的旋转对象:

  1. private float rotateTri; //用于三角形的旋转;  
  2. private float rotateQua; //用于四边形的旋转;

        下面就介绍旋转方法了,在Android中,使用glRotatef(float angle, float x, float y, float z)方法将某个物体沿指定的轴旋转,其中angle是一个变量,代表对象转过的角度,具体使用方法如下:

  1. /** 
  2. * 旋转四边形 
  3. * 参数:  
  4. * 第一个参数是旋转角度  
  5. * 之后是x、y、z共同决定旋转轴方向的参数  
  6. * 例如:1,0,0 表示经过x坐标的一个单位向右旋转  
  7. *      -1,0,0 表示.................向左旋转  
  8. * */  
  9. gl.glRotatef(rotateQua, 1.0f, 0.0f, 0.0f);

        为了使图像一直旋转下去,我们在onDrawFrame方法中,一直修改角度的变量,如下:

  1. //改变旋转的角度  
  2.  rotateTri += 0.5f;  
  3.  rotateQua -= 0.5f; 

        上述我们已经基本完成了四边形的旋转,三角形也类似,所有源码如下:

  1. package org.ourunix.android.opengltest;  
  2.   
  3. import java.nio.ByteBuffer;  
  4. import java.nio.ByteOrder;  
  5. import java.nio.IntBuffer;  
  6.   
  7. import javax.microedition.khronos.egl.EGLConfig;  
  8. import javax.microedition.khronos.opengles.GL10;  
  9.   
  10. import android.app.Activity;  
  11. import android.opengl.GLSurfaceView;  
  12. import android.opengl.GLSurfaceView.Renderer;  
  13. import android.os.Bundle;  
  14.   
  15. public class OpenGLTestActivity extends Activity {  
  16.     /** Called when the activity is first created. */  
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         GLSurfaceView glView = new GLSurfaceView(this);  
  21.         glView.setRenderer(new GLRender());  
  22.         setContentView(glView);  
  23.     }  
  24.       
  25.     public class GLRender implements Renderer{    
  26.         private int one = 0x10000;    
  27.         private int[] trigger = {0, one, 0, -one, -one, 0, one, -one, 0};    
  28.         private int[] quarter = {one, one, 0, -one, one, 0, one, -one, 0,    
  29.                 -one, -one, 0};    
  30.         private int[] color = {one, 00, one,  
  31.                                 0, one, 0, one,  
  32.                                 00, one, one};  
  33.         //准备三角各顶点    
  34.         private IntBuffer triggerBuffer = BufferUtil.iBuffer(trigger);    
  35.         //准备四边顶点    
  36.         private IntBuffer quarterBuffer = BufferUtil.iBuffer(quarter);    
  37.         //准备三角形颜色  
  38.         private IntBuffer colorBuffer = BufferUtil.iBuffer(color);  
  39.           
  40.         private float rotateTri; //用于三角形的旋转;  
  41.         private float rotateQua; //用于四边形的旋转;  
  42.           
  43.             
  44.         //咳,咳现在开始画图了    
  45.         @Override    
  46.         public void onDrawFrame(GL10 gl) {    
  47.             // TODO Auto-generated method stub    
  48.             //清楚屏幕和深度缓存    
  49.             gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);    
  50.             gl.glLoadIdentity();    
  51.             //现将屏幕向左移动,用来画三角形    
  52.             gl.glTranslatef(-1.5f, 0.0f, -6.0f);   
  53.             //旋转三角形  
  54.             gl.glRotatef(rotateTri, 0.0f, 1.0f, 0.0f);  
  55.             //允许设置顶点    
  56.             gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);   
  57.             //开启颜色渲染功能  
  58.             gl.glEnableClientState(GL10.GL_COLOR_ARRAY);  
  59.             //设置三角形    
  60.             gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);   
  61.             //给三角形的每一顶点着色  
  62.             gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer);  
  63.             //绘制三角形    
  64.             gl.glDrawArrays(GL10.GL_TRIANGLES, 03);   
  65.             //关闭颜色渲染功能  
  66.             gl.glDisableClientState(GL10.GL_COLOR_ARRAY);  
  67.             //绘制三角形结束  
  68.             gl.glFinish();  
  69.               
  70.             //重置    
  71.             gl.glLoadIdentity();    
  72.             //现将屏幕向左移动,用来画四边形    
  73.             gl.glTranslatef(1.5f, 0.0f, -6.0f);   
  74.             /** 
  75.              * 旋转四边形 
  76.              * 参数:  
  77.              * 第一个参数是旋转角度  
  78.              * 之后是x、y、z共同决定旋转轴方向的参数  
  79.              * 例如:1,0,0 表示经过x坐标的一个单位向右旋转  
  80.              *      -1,0,0 表示.................向左旋转  
  81.              * */  
  82.             gl.glRotatef(rotateQua, 1.0f, 0.0f, 0.0f);  
  83.             //设置四边形    
  84.             gl.glVertexPointer(3, GL10.GL_FIXED, 0, quarterBuffer);    
  85.             //绘制四边形    
  86.             gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 04);    
  87.             gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);  
  88.             //绘制正方形结束  
  89.             gl.glFinish();  
  90.             gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);    
  91.               
  92.               
  93.             //改变旋转的角度  
  94.             rotateTri += 0.5f;  
  95.             rotateQua -= 0.5f;  
  96.         }    
  97.     
  98.         //当窗口改变时,调用,至少在创建窗口时调用一次,这边设置下场景大小    
  99.         @Override    
  100.         public void onSurfaceChanged(GL10 gl, int width, int height) {    
  101.             // TODO Auto-generated method stub    
  102.             //设置OpenGL场景大小    
  103.             float ratio = (float) width / height;    
  104.             gl.glViewport(00, width, height);    
  105.             gl.glMatrixMode(GL10.GL_PROJECTION);//设置为投影矩阵模式    
  106.             gl.glLoadIdentity();//重置    
  107.             gl.glFrustumf(-ratio, ratio, -11110);//设置视角    
  108.             gl.glMatrixMode(GL10.GL_MODELVIEW);    
  109.             gl.glLoadIdentity();    
  110.         }    
  111.     
  112.         //当窗口被创建时我们可以做些初始化工作    
  113.         @Override    
  114.         public void onSurfaceCreated(GL10 gl, EGLConfig config) {    
  115.             // TODO Auto-generated method stub    
  116.             //告诉系统对透视进行修正    
  117.             gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);    
  118.             //设置清除屏幕时所用的颜色,参数依次为红、绿、蓝、Alpha值    
  119.             gl.glClearColorx(0000);    
  120.             //启用阴影平滑    
  121.             gl.glShadeModel(GL10.GL_SMOOTH);    
  122.             //以下是关于深度缓存的设置,非常重要    
  123.             gl.glClearDepthf(1.0f);//设置深度缓存    
  124.             gl.glEnable(GL10.GL_DEPTH_TEST);//启用深度测试    
  125.             gl.glDepthFunc(GL10.GL_LEQUAL);//所做深度测试的类型    
  126.         }    
  127.             
  128.     }    
  129.         
  130.     public static class BufferUtil {    
  131.         public static IntBuffer intBuffer;    
  132.     
  133.         public static IntBuffer iBuffer(int[] a) {    
  134.             // 先初始化buffer,数组的长度*4,因为一个float占4个字节    
  135.             ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);    
  136.             // 数组排列用nativeOrder    
  137.             mbb.order(ByteOrder.nativeOrder());    
  138.             intBuffer = mbb.asIntBuffer();    
  139.             intBuffer.put(a);    
  140.             intBuffer.position(0);    
  141.             return intBuffer;    
  142.         }    
  143.     }    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值