暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Android App开发超实用实例 | OpenGL在Android手机上通过手势控制立方体旋转

665

OpenGL(Open Graphics Library)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API),它由数百个不同的函数调用组成,用来呈现复杂的三维景象。下面这个实例演示了使用OpenGL在Android手机上通过手势控制立方体旋转。


01

实例功能


此实例主要通过使用GLSurfaceView控件加载自定义OpenGL渲染器Renderer,并在该Renderer的glRotatef()方法中根据传入的参数值旋转立方体,实现根据手势的变化旋转立方体。当实例运行之后,使用手指在屏幕上任意滑动,立方体将根据手势的变化进行旋转,效果分别如图1(a)和图1(b)所示。


■ 图1


02

实现代码


public class MainActivity extends Activity {
 float myLastX,myLastY;//用于记录上一次触摸点坐标
 float myFactor=180.0f/320;
 MyRenderer myRenderer;
 GLSurfaceView myGLSurfaceView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  myGLSurfaceView = (GLSurfaceView) findViewById(R.id.myGLSurfaceView);
  myRenderer=new MyRenderer(this); //初始化自定义渲染器
  myGLSurfaceView.setRenderer(myRenderer);
 }
 @Override
 public boolean onTouchEvent(MotionEvent event){
  //获取当前触摸点坐标
  float myX=event.getX();
  float myY=event.getY();
  switch(event.getAction()){
   case MotionEvent.ACTION_MOVE:
    //计算坐标变化量
    float myDeltaX=myX-myLastX;
    float myDeltaY=myY-myLastY;
    //根据坐标变化值设置立方体旋转角度
    myRenderer.myRotateY +=myDeltaX*myFactor;
    myRenderer.myRotateX +=myDeltaY*myFactor;
  }
  //记录当前触摸点位置,并拦截默认触摸事件
  myLastX=myX;
  myLastY=myY;
  return true;
 }
}


03

代码说明


上面这段代码在MyCode\MySampleN20\app\src\main\java\com\bin\luo\mysample\ MainActivity.java文件中。在上面这段代码中,myRenderer.myRotateX和myRenderer.myRotateY用于通过自定义的OpenGL渲染器MyRenderer设置立方体的旋转角度,代码如下面所示:

public void onDrawFrame(GL10 gl) {
  gl.glClearColor(1.0f, 1.0f, 1.0f,1.0f);
  gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
  gl.glMatrixMode(GL10.GL_MODELVIEW);
  gl.glLoadIdentity();
  gl.glTranslatef(0f, 0.0f, -2.0f);
  gl.glRotatef(myRotateX, 1, 0, 0);//根据传入的角度围绕X轴旋转
  gl.glRotatef(myRotateY, 0, 1, 0);//根据传入的角度围绕Y轴旋转
  gl.glVertexPointer(3, GL10.GL_FLOAT, 0, myVerticesBuffer);
  gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, myTexturesBuffer);
  gl.glBindTexture(GL10.GL_TEXTURE_2D, myTextureID[0]);
  gl.glDrawElements(GL10.GL_TRIANGLES,myBytesBuffer.remaining(),
          GL10.GL_UNSIGNED_BYTE, myBytesBuffer);
 }


上面这段代码在MyCode\MySampleN20\app\src\main\java\com\bin\luo\mysample\ MyRenderer.java文件中。在上面这段代码中,gl.glRotatef()方法用于根据指定的角度旋转立方体,关于该方法的语法说明请参考实例145。

关于MyRenderer类和MainActivity类的其他内容请参考此实例的对应源代码。此实例的完整代码在MyCode\MySampleN20文件夹中。


04

补充说明


在测试代码时,必须保持网络畅通。


05

源代码下载

关注微信公众号,后台回复关键词 “Android App开发超实用代码146” 即可获得完整源代码。


06

参考书籍


扫码优惠购书


《Android App开发超实用代码集锦——jQuery Mobile+OpenCV+O》

ISBN:9787302589358

作者:罗帅、罗斌

定价:99元



问题描述+解决方案+真实源码+效果截图

介绍jQuery Mobile、OpenCV、OpenGL等在Android平台运行的应用

300个实例,提供完整源代码,边看边做边学



文章转载自清华计算机学堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论