明確原理:
先確定一下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);