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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM