zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    [HAOI2006] 旅行
    Vue 2 --v-model、局部组件和全局组件、父子组件传值、平行组件传值
    Flume简介及安装
    MySQL数据目录更改及相关问题解决方案
    更换gcc工具链
    支持多种类型的数据集合作为数据源
    23种设计模式--中介者模式-Mediator Pattern
    PID算法原理 一图看懂PID的三个参数
    内存四区
    趣味算法讲解
  • 原文地址:https://www.cnblogs.com/lws520/p/5997030.html
Copyright © 2011-2022 走看看