Opengl es Android 3D 手指触控旋转+放大object
明确原理:
先确定一下OpenGL里面的坐标为:x轴正方向为屏幕向右,y轴正方向为屏幕向上,z轴正方向为屏幕由里向外。
当手指在X轴方向上移动时,画面中物体应绕Y轴方向旋转,则为gl.glRotatef(Angle,0,1,0);
当手指在Y轴方向上移动时,画面中物体应绕X轴方向旋转,则为gl.glRotatef(Angle,1,0,0);
除此之外,android中屏幕响应手势移动所应用的function为:onTouchEvent.
下面展示代码:
public boolean onTouchEvent(MotionEvent e){ // TODO Auto-generated method stub mDetector.onTouchEvent(e); y = e.getY(); x = e.getX(); if(e.getAction()==MotionEvent.ACTION_POINTER_DOWN){//已经有一个手指在屏幕上了,此刻又多加了一个手指,即两只手指在屏幕上时启动 baseValue = 0;//前一个手势的两只手指之间的距离 float xx = e.getRawX(); float yy = e.getRawY(); } else if (e.getAction() == MotionEvent.ACTION_MOVE){ if(e.getPointerCount()==2){//两只手指时 float xx = e.getX(0)-e.getX(1); float yy = e.getY(0)-e.getY(1); float value = (float)Math.sqrt(xx*xx+yy*yy);//计算两只手指之间的距离 if(baseValue==0){ baseValue=value; } else{ if(value-baseValue >= 10 || value-baseValue <= -10){//防止手指在屏幕上抖动就触发 float scale = value/baseValue; renderer.scale = scale; Log.d("TAG", "Scale"+scale); requestRender(); } } } else if(e.getPointerCount()==1){//一只手指时 float dy = y - mPreviousY;//计算触控笔Y位移 float dx = x - mPreviousX;//计算触控笔X位移 renderer.center.mAngleX += dy * TOUCH_SCALE_FACTOR;//设置沿x轴旋转角度 renderer.center.mAngleY += dx * TOUCH_SCALE_FACTOR;//设置沿y轴旋转角度 requestRender();//重绘画面 } } mPreviousY = y;//记录触控笔位置 mPreviousX = x;//记录触控笔位置 MainActivity.temp=false; return true; }
NewRender()是我继承Renderer创建的一个class.
renderer.center.mAngleX += dy * TOUCH_SCALE_FACTOR;//设置沿x轴旋转角度 renderer.center.mAngleY += dx * TOUCH_SCALE_FACTOR;//设置沿y轴旋转角度
center.mAngleX 和 center.mAngleY是指我的Object(center)的旋转角度。
在center中,我的旋转角度设置为:
gl.glRotatef(mAngleX, 1, 0, 0);//旋转 gl.glRotatef(mAngleY, 0, 1, 0);
gl.glRotatef(mAngleZ, 0, 0, 1);