ZoomIn ZoomOut OpenGl带按钮Android Studio

时间:2017-07-06 09:11:08

标签: android opengl-es zoom

我的OpenGl项目中有ZoomIn ZoomOut的问题。 我有一个GlSurfaseView,在这个函数中我想改变Z值的变焦值。 我在MyGlSurfaceView中创建函数Kek并使用z-value,但是我无法在MyGlActivity中调用此函数。 如果还有其他方法可以解决这个问题,请告诉我们 请帮忙。

public class MyGLActivity extends Activity {
private GLSurfaceView glView; // Задаем вьюшку для сцены
float zPlus = 0;
String a = "aaa";
float defaul = 2.0f;
MyGLSurfaceView ZoomInOut;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_gl);
    glView = (MyGLSurfaceView) findViewById(R.id.glSurfaceViewID);

                      /*ОБРАБОТКА НАЖАТИЙ НА КНОПКИ*/

    Button ZoomIn = findViewById(R.id.ZoomIn);
    Button ZoomOut = findViewById(R.id.ZoomOut);
    ZoomOut.setOnClickListener(ZoomOutListener);
    ZoomIn.setOnClickListener(ZoomInListener);
}

private View.OnClickListener ZoomInListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        MyGLSurfaceView.kek();
        Log.e("ZoomIn", "ZoomIn");
    }
};

我的GlRenderer

public class MyGLRenderer implements  GLSurfaceView.Renderer {
private Context context;
private TextureCube cube;
private TextureRoad road;
private TextureTree tree;

Button Zplus;

float angleX = 0;   // по Х Влево вправо
float angleY = 0;   // по У
float z = -26;
float previousAngleX;

//Конструктор для построения
public MyGLRenderer(Context context) {
    this.context = context;
    cube = new TextureCube(); // текстуры куба
    road = new TextureRoad(); // текстуры дороги
    tree = new TextureTree(); // текстуры дерева

}


@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  // Цвет черный
    gl.glClearDepthf(1.0f);            // Глубина цвета
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthFunc(GL10.GL_LEQUAL);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);  //
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glDisable(GL10.GL_DITHER);


    cube.loadTexture(gl, context);    // Загрузка текстуры куба
    road.loadTextureRoad(gl, context); // Загрузка текстуры дороги
    tree.loadTextureTree(gl, context); // загрузка текстуры дерева

    gl.glEnable(GL10.GL_TEXTURE_2D);  // Наложение текстуры
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    if (height == 0) height = 1;
    float aspect = (float)width / height;

    //просмотр
    gl.glViewport(0, 0, width, height);

    // Перспектива
    gl.glMatrixMode(GL10.GL_PROJECTION); // выбор матрицы
    gl.glLoadIdentity();                 // обновление матрицы

    GLU.gluPerspective(gl, 45, aspect, 0.1f,  150000.0f);

    gl.glMatrixMode(GL10.GL_MODELVIEW);  // Выбираем модель просмотра матрицы
    gl.glLoadIdentity();                 // обновление положение
}

@Override
public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    // ----- Рендеринг ----- //
    gl.glLoadIdentity(); // обновляем положение

    //проверка пола
    if (z == -16) {
        //Движение сцены
        z = -18;
    }

    gl.glTranslatef(angleY / 8, angleX / 8, z); //перемещает Z X Y
        GLU.gluLookAt(gl, 3, -z / 2, 0, 0, 0, 0, 0, 1, 0); //посмотрим что выйдет :D

    /*ОПТИМИЗИРОВАТЬ РИСОВКА ТОЛЬКО ПОСЛЕ ИЗМЕНЕНИЯ ЗУМА или ПОСЛЕ ТАЧА*/

    /*будет лОгать*/
    //проверка на флаг

        //Log.d("РАВНЫ",  "angleY = " + Float.toString(angleY));
        //Log.d("РАВНЫ",  "angleX = " + Float.toString(angleX));

        cube.draw(gl); // Рисуем куб
       // Log.e("Нарисовали", "кубик");
        road.drawRoad(gl); // Рисуем дорогу
       // Log.e("1", "Дорогу");
        tree.drawTree(gl); // Рисуем дерево
       // Log.e("2", "Палку");

      //  Log.e("КЕК", "НУ ТЫ ВАПЩЭ");
      //  Log.d("РАВНЫ",  "angleY = " + Float.toString(angleY));
      //  Log.d("РАВНЫ",  "previousAngleX = " + Float.toString(previousAngleX));
}

}

我的GlSurfaceView

public class MyGLSurfaceView extends GLSurfaceView {

public static float kek;
MyGLRenderer renderer;
private Button b;
private Button ZoomIn;
//Button ZoomOut;
private final float TOUCH_SCALE_FACTOR = 90.0f / 320.0f;

public MyGLSurfaceView(Context context, AttributeSet attrs) {
    super(context);
    renderer = new MyGLRenderer(context);
    this.setRenderer(renderer);
    // Обнолвние фокуса в зависимости от передвижения камеры
    this.requestFocus();
    this.setFocusableInTouchMode(true);
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
}

//ВСЕ ПО НОВОЙ//
private float mPosX;
private float mPosY;
private ScaleGestureDetector mScaleDetector;
private float mLastTouchX;
private float mLastTouchY;
private float mScaleFactor = 1.f;
private static final int INVALID_POINTER_ID = -1;
private int mActivePointerId = INVALID_POINTER_ID;
private float getZplus;
private float getZmin;

@Override
public boolean onTouchEvent(MotionEvent ev) {
    mScaleDetector.onTouchEvent(ev);


    final int action = ev.getAction();
    switch (action & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN: {
            final float x = ev.getX();
            final float y = ev.getY();

            mLastTouchX = x;
            mLastTouchY = y;
            mActivePointerId = ev.getPointerId(0);

            break;
        }

        case MotionEvent.ACTION_MOVE: {
            final int pointerIndex = ev.findPointerIndex(mActivePointerId);
            final float x = ev.getX(pointerIndex);
            final float y = ev.getY(pointerIndex);

            if (!mScaleDetector.isInProgress()) {
                final float dx = x - mLastTouchX;
                final float dy = y - mLastTouchY;

                mPosX += dx;
                mPosY += dy;

                renderer.angleX += dy * TOUCH_SCALE_FACTOR;
                renderer.angleY += dx * TOUCH_SCALE_FACTOR;

                invalidate();
            }

            mLastTouchX = x;
            mLastTouchY = y;

            break;
        }

        case MotionEvent.ACTION_UP: {
            mActivePointerId = INVALID_POINTER_ID;
            break;
        }

        case MotionEvent.ACTION_CANCEL: {
            mActivePointerId = INVALID_POINTER_ID;
            break;
        }

        case MotionEvent.ACTION_POINTER_UP: {
            final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
                    >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
            final int pointerId = ev.getPointerId(pointerIndex);
            if (pointerId == mActivePointerId) {
                final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                mLastTouchX = ev.getX(newPointerIndex);
                mLastTouchY = ev.getY(newPointerIndex);
                mActivePointerId = ev.getPointerId(newPointerIndex);
            }
            break;
        }
    }
    return true;
}

//отдаление приближение
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        mScaleFactor *= detector.getScaleFactor();
        mScaleFactor = Math.max(18.0f, Math.min(mScaleFactor, 1500.0f));
        renderer.z = -mScaleFactor;
        invalidate();
        return true;
    }
}

public void Kek() {
    renderer.z +=2.0f;
}}

0 个答案:

没有答案