يعد رسم الكائنات على الشاشة ميزة أساسية جدًا في 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); }
ما لم تكن لديك كائنات تتغير دون أي تفاعل من المستخدم، فمن الجيد عادةً أن يكون لديك هذا تم تفعيل العلم. كن مستعدًا لإلغاء تعليق هذا الرمز، لأن الدرس التالي يجعل هذه المكالمة قابلة للتطبيق مرة أخرى.