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 Canvas
và Drawable
. 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.