הוספת תנועה

ציור אובייקטים על המסך הוא תכונה די בסיסית של OpenGL, אבל ניתן לעשות זאת באמצעות שיעורי framework של גרפיקה ב-Android, כולל Canvas ו Drawable אובייקטים. OpenGL ES מספק יכולות נוספות עבור הזזה וטרנספורמציה של אובייקטים מצוירים בתלת ממד או בדרכים ייחודיות אחרות לחוויות משתמש מרתקות.

בשיעור הזה, תלמדו איך להוסיף תנועה כדי להתקדם לשימוש ב-OpenGL ES לצורה עם סיבוב.

סיבוב של צורה

קל יחסית לבצע סיבוב של אובייקט שרטוט באמצעות OpenGL ES 2.0. בכלי לרינדור, יוצרים מטריצת טרנספורמציה אחרת (מטריצה סיבובית) ואז משלבים אותה עם ההיטל מטריצות של טרנספורמציה של תצוגת מצלמה:

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

אם המשולש לא מסתובב לאחר שביצעת שינויים אלה, ודא שהוספת הערה GLSurfaceView.RENDERMODE_WHEN_DIRTY ההגדרה הזו, כפי שמתואר בקטע הבא.

הפעלת רינדור רציף

אם עקבתם בהתמדה אחרי הקוד לדוגמה בכיתה הזו, הוסיפו חשוב להוסיף הערה על השורה שמגדירה שמצב העיבוד מצייר רק כשהוא מלוכלך, אחרת OpenGL מסובב את הצורה רק פעם אחת וממתין לקריאה לפונקציה requestRender() מהמאגר 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);
}

אלא אם יש אובייקטים שמשתנים ללא אינטראקציה עם המשתמש, בדרך כלל כדאי התכונה הניסיונית מופעלת. צריך לבטל את הוספת ההערה לקוד הזה, כי השיעור הבא יהפוך את השיחה לרלוונטית שוב.