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.