Thêm chuyển động

Vẽ các đố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 việc này với Các lớp khung đồ hoạ Android, bao gồm Canvas và Đối tượng Drawable. OpenGL ES cung cấp các tính năng bổ sung cho di chuyển và biến đổi các đối tượng được vẽ theo ba chiều hoặc theo những cách độc đáo khác để tạo trải nghiệm người dùng hấp dẫn hơn.

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

Xoay một hình dạng

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

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 hình tam giác của bạn không xoay sau khi thực hiện những thay đổi này, hãy đảm bảo bạn đã nhận xét GLSurfaceView.RENDERMODE_WHEN_DIRTY như được 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 thiết lập chế độ kết xuất chỉ vẽ khi có bẩn, nếu không OpenGL chỉ xoay hình dạng một mức tăng rồi 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ừ phi bạn có các đối tượng thay đổi mà không có sự tương tác nào của người dùng, tốt nhất là nên cờ đã được bật. Hãy chuẩn bị sẵn sàng để huỷ nhận xét mã này vì bài học tiếp theo sẽ áp dụng lệnh gọi này một lần nữa.