Rysowanie obiektów na ekranie to dość podstawowa funkcja trybu OpenGL, ale możesz to robić
klasy platformy graficznej na Androida, w tym Canvas
oraz
Drawable
obiektów. OpenGL ES zapewnia dodatkowe możliwości
przenoszenie i przekształcanie rysowanych obiektów w trzech wymiarach lub na inne unikalne sposoby tworzenia
atrakcyjne wrażenia użytkowników.
Ta lekcja pozwoli Ci zrobić kolejny krok naprzód i zacząć korzystać z platformy OpenGL ES, pokazując, jak dodawać ruch na kształt z obrotem.
Obracanie kształtu
Obracanie obiektu rysunku w środowisku OpenGL ES 2.0 jest stosunkowo proste. W mechanizmie renderowania utwórz kolejną macierz przekształcenia (macierzy obrotu), a następnie połącz ją ze swoim rzutem macierze przekształcenia obrazu z kamery:
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); }
Jeśli po wprowadzeniu tych zmian trójkąt nie zostanie obrócony, sprawdź, czy
GLSurfaceView.RENDERMODE_WHEN_DIRTY
jak opisano w następnej sekcji.
Włącz ciągłe renderowanie
Jeśli do tego momentu dokładnie postępujesz zgodnie z przykładowym kodem z tych zajęć, wykonaj
komentuj wiersz, który ustawia tryb renderowania tylko wtedy, gdy jest zabrudzony. W przeciwnym razie OpenGL
obraca kształt tylko o jedno zwiększenie, a następnie czeka na wywołanie funkcji requestRender()
z kontenera GLSurfaceView
:
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); }
Jeśli obiekty nie zmieniają się bez interakcji ze strony użytkownika, flaga jest włączona. Przygotuj się na usunięcie komentarza z kodu, ponieważ dzięki następnej lekcji ta rozmowa będzie odpowiednia jeszcze raz.