إضافة حركة

يعد رسم الكائنات على الشاشة ميزة أساسية جدًا في OpenGL، ولكن يمكنك القيام بذلك مع فئات إطار عمل رسومات 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 على النحو الموضَّح في القسم التالي.

تفعيل العرض المستمر

إذا كنت قد اتبعت نموذج التعليمة البرمجية بحرص في هذه الفئة حتى الآن، تأكد من التعليق على السطر الذي يرسم وضع العرض فقط عند تشتيت الانتباه، وإلا لتدوير الشكل زيادة واحدة فقط، ثم انتظار استدعاء 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);
}

ما لم تكن لديك كائنات تتغير دون أي تفاعل من المستخدم، فمن الجيد عادةً أن يكون لديك هذا تم تفعيل العلم. كن مستعدًا لإلغاء تعليق هذا الرمز، لأن الدرس التالي يجعل هذه المكالمة قابلة للتطبيق مرة أخرى.