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.