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

 

posted @ 2016-10-25 15:57  风吹来的砂  阅读(2675)  评论(0编辑  收藏  举报