歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 3D物體的移動

Android 3D物體的移動

日期:2017/3/1 11:10:10   编辑:Linux編程

3D裡面物體的移動和2D裡面的差不多,主要區別是,2D裡面是改變坐標的值,然後用draw()方法來顯示物體;3D同樣是改變坐標的值,但是是在原坐標的基礎上用旋轉,平移來顯示物體。下面來看個簡單的例子吧。

主要代碼:

  1. package yy.cal;
  2. import javax.microedition.khronos.egl.EGLConfig;
  3. import javax.microedition.khronos.opengles.GL10;
  4. import Android.content.Context;
  5. import android.opengl.GLSurfaceView;
  6. import android.opengl.GLU;
  7. import android.view.KeyEvent;
  8. import android.view.MotionEvent;
  9. public class MySurfaceView extends GLSurfaceView{
  10. private final float TOUCH_SCALE_FACTOR = 180.0f/320;//角度縮放比例
  11. private SceneRenderer mRenderer;//場景渲染器
  12. private float mPreviousX;//上次的觸控位置X坐標
  13. public MySurfaceView(Context context) {
  14. super(context);
  15. mRenderer = new SceneRenderer(); //創建場景渲染器
  16. setRenderer(mRenderer); //設置渲染器
  17. setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//設置渲染模式為主動渲染
  18. }
  19. //觸摸事件回調方法
  20. @Override
  21. public boolean onTouchEvent(MotionEvent e) {
  22. float x = e.getX();
  23. switch (e.getAction()) {
  24. case MotionEvent.ACTION_MOVE:
  25. float dx = x - mPreviousX;//計算觸控筆X位移
  26. mRenderer.angle += dx * TOUCH_SCALE_FACTOR;//設置沿x軸旋轉角度
  27. requestRender();
  28. //重繪畫面
  29. }
  30. mPreviousX = x;//記錄觸控筆位置
  31. return true;
  32. }
  33. public boolean onKeyDown(int keyCode,KeyEvent event){
  34. if(keyCode==KeyEvent.KEYCODE_DPAD_UP)
  35. {
  36. mRenderer.x +=0.5f;
  37. }
  38. if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){
  39. mRenderer.x -=0.5f;
  40. }
  41. if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){
  42. mRenderer.angle+=90;
  43. }
  44. if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){
  45. mRenderer.angle+=90;
  46. }
  47. return super.onKeyDown(keyCode, event);
  48. }
  49. private class SceneRenderer implements GLSurfaceView.Renderer
  50. {
  51. Cube cube=new Cube();//立方體
  52. float angle=45;//總旋轉角度
  53. float x=0,y=0,z=0;
  54. public void onDrawFrame(GL10 gl) {
  55. //設置為打開背面剪裁
  56. gl.glEnable(GL10.GL_CULL_FACE);
  57. //設置著色模型為平滑著色
  58. gl.glShadeModel(GL10.GL_SMOOTH);
  59. //清除顏色緩存於深度緩存
  60. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  61. //設置當前矩陣為模式矩陣
  62. gl.glMatrixMode(GL10.GL_MODELVIEW);
  63. //設置當前矩陣為單位矩陣
  64. gl.glLoadIdentity();
  65. GLU.gluLookAt//不太可能變形的視角——小視角
  66. (
  67. gl,
  68. 0f, //人眼位置的X
  69. 10f, //人眼位置的Y
  70. 15.0f, //人眼位置的Z
  71. 0, //人眼球看的點X
  72. 0f, //人眼球看的點Y
  73. 0, //人眼球看的點Z
  74. 0,
  75. 1,
  76. 0
  77. );
  78. //旋轉總坐標系
  79. gl.glRotatef(angle, 0, 1, 0);
  80. //繪制右立方體
  81. gl.glPushMatrix();
  82. gl.glTranslatef(x, y, z);
  83. cube.drawSelf(gl);
  84. gl.glPopMatrix();
  85. }
  86. public void onSurfaceChanged(GL10 gl, int width, int height) {
  87. //設置視窗大小及位置
  88. gl.glViewport(0, 0, width, height);
  89. //設置當前矩陣為投影矩陣
  90. gl.glMatrixMode(GL10.GL_PROJECTION);
  91. //設置當前矩陣為單位矩陣
  92. gl.glLoadIdentity();
  93. //計算透視投影的比例
  94. float ratio = (float) height/width ;
  95. //調用此方法計算產生透視投影矩陣
  96. //gl.glFrustumf( -1, 1,-ratio, ratio, 1, 100); //可能變形的視角——大視角
  97. gl.glFrustumf( -1, 1,-ratio, ratio, 8f, 100); //不太可能變形的視角——小視角
  98. }
  99. public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  100. //關閉抗抖動
  101. gl.glDisable(GL10.GL_DITHER);
  102. //設置特定Hint項目的模式,這裡為設置為使用快速模式
  103. gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
  104. //設置屏幕背景色黑色RGBA
  105. gl.glClearColor(0,0,0,0);
  106. //啟用深度測試
  107. gl.glEnable(GL10.GL_DEPTH_TEST);
  108. }
  109. }
  110. }
Copyright © Linux教程網 All Rights Reserved