歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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. }  
Copyright © Linux教程網 All Rights Reserved