حرکت را اضافه کنید

طراحی اشیاء روی صفحه یک ویژگی کاملاً اساسی OpenGL است، اما می‌توانید این کار را با سایر کلاس‌های چارچوب گرافیکی اندروید، از جمله Canvas و Drawable انجام دهید. OpenGL ES قابلیت های اضافی را برای جابجایی و تبدیل اشیاء ترسیم شده در سه بعدی یا به روش های منحصر به فرد دیگر برای ایجاد تجربیات کاربر قانع کننده فراهم می کند.

در این درس، با یادگیری نحوه اضافه کردن حرکت به شکل با چرخش، یک قدم دیگر به سمت استفاده از OpenGL ES برمی دارید.

یک شکل را بچرخانید

چرخاندن یک شیء طراحی با OpenGL ES 2.0 نسبتاً ساده است. در رندر خود، یک ماتریس تبدیل دیگری (یک ماتریس چرخشی) ایجاد کنید و سپس آن را با ماتریس های تبدیل نمای تصویر و دوربین خود ترکیب کنید:

کاتلین

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

اگر مثلث شما پس از انجام این تغییرات نمی چرخد، مطمئن شوید که تنظیمات GLSurfaceView.RENDERMODE_WHEN_DIRTY را همانطور که در بخش بعدی توضیح داده شد، نظر داده اید.

رندر مداوم را فعال کنید

اگر تا اینجا کد مثال را در این کلاس دنبال کرده اید، مطمئن شوید که خطی را که حالت رندر را تنظیم می کند، فقط وقتی کثیف است، کامنت بگذارید، در غیر این صورت OpenGL شکل را فقط یک افزایش می چرخاند و سپس منتظر فراخوانی برای requestRender() می شود. requestRender() از ظرف GLSurfaceView :

کاتلین

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

معمولاً بهتر است این پرچم را روشن کنید، مگر اینکه اشیا بدون هیچ گونه تعامل کاربر تغییر کنند. برای لغو نظر این کد آماده باشید، زیرا درس بعدی این تماس را بار دیگر قابل اجرا می کند.