Добавление движений

Этот урок научит вас

  1. Повернуть фигуру
  2. Включение непрерывной визуализации

Вы также должны прочитать

Графические объекты на экране являются довольно основной функциональностью OpenGL, но вы можете сделать это с помощью других Android классов графических библиотек, включая Canvas и Drawable объектов. OpenGL ES предоставляет дополнительные возможности для перемещения и преобразования графических объектов в трех измерениях, а так же другие уникальные способы создавать привлекательный пользовательский интерфейс.

В этом уроке, вы сделаете еще один шаг вперед в использовании OpenGL ES, узнав, как добавить движение фигур используя вращение.

Повернуть фигуру

Поворот графического объекта в OpenGL ES 2.0 является относительно простым. Вы создаете другую матрицу преобразования (матрица вращения), а затем объединяете её с вашими матрицами преобразований проекции и положения камеры :

private float[] mRotationMatrix = new float[16];
public void onDrawFrame(GL10 gl) {
    ...
    float[] scratch = new float[16];

    // Create a rotation transformation for the triangle
    long time = SystemClock.uptimeMillis() % 4000L;
    float angle = 0.090f * ((int) time);
    Matrix.setRotateM(mRotationMatrix, 0, angle, 0, 0, -1.0f);

    // Combine the rotation matrix with the projection and camera view
    // Note that the mMVPMatrix factor *must be first* in order
    // for the matrix multiplication product to be correct.
    Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);

    // Draw triangle
    mTriangle.draw(scratch);
}

Если ваш треугольник не вращается после внесения этих изменений, убедитесь, что вы закомментировали GLSurfaceView.RENDERMODE_WHEN_DIRTY настройку, как описано в следующем разделе.

Включение непрерывной визуализации

Если вы прилежно следовали примерами кода в этом курсе до этого момента, убедитесь, что вы закомментировали строку, которая устанавливает режим визуализации только при изменениях, в противном случае OpenGL выполнит только одно приращение вращения фигуры и затем будет ждать вызова requestRender() от GLSurfaceView контейнера:

public MyGLSurfaceView(Context context) {
    ...
    // Render the view only when there is a change in the drawing data.
    // To allow the triangle to rotate automatically, this line is commented out:
    //setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}

Если у вас нет объектов меняющихся без взаимодействия с пользователем, как правило, это хорошая идея включить этот флаг. Будьте готовы раскомментировать этот код, потому что на следующем уроке этот вызов вновь необходим.