Bewegung hinzufügen

Das Zeichnen von Objekten auf dem Bildschirm ist eine ziemlich grundlegende Funktion von OpenGL, aber Sie können dies auch mit anderen Android-Grafik-Framework-Klassen tun, einschließlich Canvas- und Drawable-Objekten. OpenGL ES bietet zusätzliche Funktionen zum Verschieben und Umwandeln gezeichneter Objekte in drei Dimensionen oder auf andere einzigartige Weise, um eine überzeugende Nutzererfahrung zu schaffen.

In dieser Lektion gehen Sie bei der Verwendung von OpenGL ES noch einen Schritt weiter. Sie lernen, einer Form Bewegung durch Drehung hinzuzufügen.

Formen drehen

Das Rotieren eines Zeichenobjekts mit OpenGL ES 2.0 ist relativ einfach. Erstellen Sie in Ihrem Renderer eine weitere Transformationsmatrix (eine Rotationsmatrix) und kombinieren Sie sie dann mit den Transformationsmatrizen für die Projektion und Kameraansicht:

Kotlin

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

Java

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

Wenn sich das Dreieck nach diesen Änderungen nicht dreht, müssen Sie die Einstellung GLSurfaceView.RENDERMODE_WHEN_DIRTY auskommentieren, wie im nächsten Abschnitt beschrieben.

Kontinuierliches Rendering aktivieren

Wenn Sie den Beispielcode in dieser Klasse bis zu diesem Punkt sorgfältig befolgt haben, kommentieren Sie die Zeile aus, mit der der Renderingmodus nur bei Schmutz gezeichnet wird. Andernfalls rotiert OpenGL die Form nur um ein Inkrement und wartet dann auf einen Aufruf von requestRender() aus dem GLSurfaceView-Container:

Kotlin

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
    }
}

Java

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

Wenn sich Objekte nicht ohne Nutzerinteraktion ändern, empfiehlt es sich, dieses Flag aktiviert zu lassen. Sie sollten die Kommentarzeichen dieses Codes entfernen, da dieser Aufruf in der nächsten Lektion wieder anwendbar ist.