Thêm chuyển động

Vẽ đối tượng trên màn hình là một tính năng khá cơ bản của OpenGL, nhưng bạn có thể thực hiện điều này với các lớp khung đồ hoạ Android khác, bao gồm cả đối tượng CanvasDrawable. OpenGL ES cung cấp thêm các chức năng giúp di chuyển và biến đổi các đối tượng đã vẽ theo không gian ba chiều hoặc theo những cách độc đáo khác để tạo ra trải nghiệm người dùng hấp dẫn.

Trong bài học này, bạn sẽ tiến thêm một bước để sử dụng OpenGL ES bằng cách tìm hiểu cách thêm chuyển động vào hình dạng bằng tính năng xoay.

Xoay một hình dạng

Việc xoay đối tượng vẽ bằng OpenGL ES 2.0 tương đối đơn giản. Trong trình kết xuất, hãy tạo một ma trận biến đổi khác (ma trận xoay), sau đó kết hợp với ma trận biến đổi phép chiếu và khung hiển thị máy ảnh:

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

Nếu tam giác không xoay sau khi thực hiện các thay đổi này, hãy đảm bảo bạn đã nhận xét trong chế độ cài đặt GLSurfaceView.RENDERMODE_WHEN_DIRTY, như mô tả trong phần tiếp theo.

Bật tính năng kết xuất liên tục

Nếu bạn đã chăm chỉ làm theo mã mẫu trong lớp này cho đến thời điểm này, hãy đảm bảo bạn nhận xét dòng đặt chế độ kết xuất chỉ vẽ khi sửa đổi, nếu không OpenGL chỉ xoay hình dạng một lần và sau đó chờ lệnh gọi đến requestRender() từ vùng chứa 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);
}

Trừ khi có các đối tượng thay đổi mà người dùng không tương tác, bạn nên bật cờ này. Hãy sẵn sàng huỷ nhận xét về mã này vì bài học tiếp theo sẽ áp dụng lại lệnh gọi này một lần nữa.