Dodaj ruch

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:

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

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:

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

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.