Android 3D物体的移动


3D里面物体的移动和2D里面的差不多,主要区别是,2D里面是改变坐标的值,然后用draw()方法来显示物体;3D同样是改变坐标的值,但是是在原坐标的基础上用旋转,平移来显示物体。下面来看个简单的例子吧。

主要代码:

  1. package yy.cal;  
  2.   
  3. import javax.microedition.khronos.egl.EGLConfig;  
  4. import javax.microedition.khronos.opengles.GL10;  
  5.   
  6. import Android.content.Context;  
  7. import android.opengl.GLSurfaceView;  
  8. import android.opengl.GLU;  
  9. import android.view.KeyEvent;  
  10. import android.view.MotionEvent;  
  11.   
  12. public class MySurfaceView extends GLSurfaceView{  
  13.     private final float TOUCH_SCALE_FACTOR = 180.0f/320;//角度缩放比例  
  14.     private SceneRenderer mRenderer;//场景渲染器   
  15.   
  16.     private float mPreviousX;//上次的触控位置X坐标  
  17.       
  18.     public MySurfaceView(Context context) {  
  19.         super(context);  
  20.         mRenderer = new SceneRenderer();    //创建场景渲染器  
  21.         setRenderer(mRenderer);             //设置渲染器       
  22.         setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//设置渲染模式为主动渲染     
  23.     }  
  24.       
  25.     //触摸事件回调方法  
  26.     @Override   
  27.     public boolean onTouchEvent(MotionEvent e) {  
  28.         float x = e.getX();  
  29.         switch (e.getAction()) {  
  30.         case MotionEvent.ACTION_MOVE:  
  31.             float dx = x - mPreviousX;//计算触控笔X位移  
  32.             mRenderer.angle += dx * TOUCH_SCALE_FACTOR;//设置沿x轴旋转角度  
  33.             requestRender();  
  34.              
  35.             //重绘画面  
  36.         }     
  37.         mPreviousX = x;//记录触控笔位置  
  38.         return true;  
  39.     }  
  40.       
  41.     public boolean onKeyDown(int keyCode,KeyEvent event){  
  42.         if(keyCode==KeyEvent.KEYCODE_DPAD_UP)  
  43.         {  
  44.             mRenderer.x +=0.5f;  
  45.         }  
  46.         if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){  
  47.             mRenderer.x -=0.5f;  
  48.         }  
  49.         if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){  
  50.              mRenderer.angle+=90;  
  51.         }  
  52.         if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){  
  53.              mRenderer.angle+=90;  
  54.         }  
  55.         return super.onKeyDown(keyCode, event);  
  56.     }  
  57.       
  58.   
  59.     private class SceneRenderer implements GLSurfaceView.Renderer   
  60.     {     
  61.         Cube cube=new Cube();//立方体  
  62.         float angle=45;//总旋转角度  
  63.         float x=0,y=0,z=0;  
  64.         public void onDrawFrame(GL10 gl) {  
  65.             //设置为打开背面剪裁  
  66.             gl.glEnable(GL10.GL_CULL_FACE);  
  67.   
  68.             //设置着色模型为平滑着色     
  69.             gl.glShadeModel(GL10.GL_SMOOTH);  
  70.               
  71.             //清除颜色缓存于深度缓存  
  72.             gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
  73.             //设置当前矩阵为模式矩阵  
  74.             gl.glMatrixMode(GL10.GL_MODELVIEW);  
  75.             //设置当前矩阵为单位矩阵  
  76.             gl.glLoadIdentity();      
  77.               
  78.             GLU.gluLookAt//不太可能变形的视角——小视角  
  79.             (  
  80.                     gl,   
  81.                     0f,   //人眼位置的X  
  82.                     10f,    //人眼位置的Y  
  83.                     15.0f,   //人眼位置的Z  
  84.                     0,  //人眼球看的点X  
  85.                     0f,   //人眼球看的点Y  
  86.                     0,   //人眼球看的点Z  
  87.                     0,   
  88.                     1,   
  89.                     0  
  90.             );    
  91.               
  92.             //旋转总坐标系  
  93.             gl.glRotatef(angle, 0, 1, 0);  
  94.               
  95.             //绘制右立方体  
  96.             gl.glPushMatrix();  
  97.             gl.glTranslatef(x, y, z);  
  98.             cube.drawSelf(gl);  
  99.             gl.glPopMatrix();  
  100.              
  101.   
  102.         }  
  103.           
  104.         public void onSurfaceChanged(GL10 gl, int width, int height) {  
  105.             //设置视窗大小及位置   
  106.             gl.glViewport(0, 0, width, height);  
  107.             //设置当前矩阵为投影矩阵  
  108.             gl.glMatrixMode(GL10.GL_PROJECTION);  
  109.             //设置当前矩阵为单位矩阵  
  110.             gl.glLoadIdentity();  
  111.             //计算透视投影的比例  
  112.             float ratio = (float) height/width ;  
  113.             //调用此方法计算产生透视投影矩阵  
  114.             //gl.glFrustumf( -1, 1,-ratio, ratio, 1, 100);   //可能变形的视角——大视角    
  115.             gl.glFrustumf( -1, 1,-ratio, ratio, 8f, 100);     //不太可能变形的视角——小视角  
  116.         }  
  117.   
  118.         public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  119.             //关闭抗抖动   
  120.             gl.glDisable(GL10.GL_DITHER);  
  121.             //设置特定Hint项目的模式,这里为设置为使用快速模式  
  122.             gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);  
  123.             //设置屏幕背景色黑色RGBA  
  124.             gl.glClearColor(0,0,0,0);              
  125.             //启用深度测试  
  126.             gl.glEnable(GL10.GL_DEPTH_TEST);  
  127.         }  
  128.     }  
  129.   
  130. }  

相关内容