Рисование объектов на экране — довольно простая функция OpenGL, но вы можете сделать это с другими классами графической платформы Android, включая объекты Canvas
и Drawable
. OpenGL ES предоставляет дополнительные возможности для перемещения и преобразования нарисованных объектов в трех измерениях или другими уникальными способами для создания привлекательного пользовательского опыта.
В этом уроке вы сделаете еще один шаг вперед в использовании OpenGL ES, научившись добавлять движение к фигуре с помощью вращения.
Поворот фигуры
Поворот объекта рисования с помощью OpenGL ES 2.0 относительно прост. В вашем рендерере создайте еще одну матрицу преобразования (матрицу вращения), а затем объедините ее с матрицами преобразования проекции и вида камеры:
Котлин
private val rotationMatrix = FloatArray(16) override fun onDrawFrame(gl: GL10) { val scratch = FloatArray(16) ... // Create a rotation transformation for the triangle val time = SystemClock.uptimeMillis() % 4000L val angle = 0.090f * time.toInt() Matrix.setRotateM(rotationMatrix, 0, angle, 0f, 0f, -1.0f) // Combine the rotation matrix with the projection and camera view // Note that the vPMatrix factor *must be first* in order // for the matrix multiplication product to be correct. Matrix.multiplyMM(scratch, 0, vPMatrix, 0, rotationMatrix, 0) // Draw triangle mTriangle.draw(scratch) }
Ява
private float[] rotationMatrix = new float[16]; @Override 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(rotationMatrix, 0, angle, 0, 0, -1.0f); // Combine the rotation matrix with the projection and camera view // Note that the vPMatrix factor *must be first* in order // for the matrix multiplication product to be correct. Matrix.multiplyMM(scratch, 0, vPMatrix, 0, rotationMatrix, 0); // Draw triangle mTriangle.draw(scratch); }
Если ваш треугольник не вращается после внесения этих изменений, убедитесь, что вы закомментировали параметр GLSurfaceView.RENDERMODE_WHEN_DIRTY
, как описано в следующем разделе.
Включить непрерывный рендеринг
Если вы старательно следовали примеру кода в этом классе до этого момента, обязательно закомментируйте строку, которая устанавливает режим рендеринга, только если он грязный, в противном случае OpenGL поворачивает фигуру только на одно приращение, а затем ждет вызова requestRender()
из контейнера GLSurfaceView
:
Котлин
class MyGLSurfaceView(context: Context) : GLSurfaceView(context) { init { ... // 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: // renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY } }
Ява
public class MyGLSurfaceView(Context context) extends GLSurfaceView { ... // 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); }
Если у вас нет объектов, которые изменяются без какого-либо взаимодействия с пользователем, обычно рекомендуется включить этот флаг. Будьте готовы раскомментировать этот код, потому что следующий урок снова сделает этот вызов применимым.