การวาดสิ่งต่างๆ บนหน้าจอเป็นคุณสมบัติที่ค่อนข้างเรียบง่ายของ OpenGL แต่คุณสามารถทำแบบนี้ได้ด้วย
คลาสเฟรมเวิร์กกราฟิก Android รวมถึง Canvas
และ
Drawable
ออบเจ็กต์ OpenGL ES มีความสามารถเพิ่มเติมสำหรับ
เคลื่อนที่และเปลี่ยนรูปแบบวัตถุที่วาดในแบบ 3 มิติหรือด้วยวิธีที่ไม่เหมือนใครอื่นๆ เพื่อสร้าง
ที่น่าดึงดูดใจของผู้ใช้
ในบทเรียนนี้ คุณได้ก้าวไปข้างหน้าของการใช้ OpenGL ES โดยการเรียนรู้วิธีเพิ่มการเคลื่อนไหว ให้เป็นรูปร่างที่มีการหมุน
หมุนรูปร่าง
การหมุนวัตถุภาพวาดด้วย OpenGL ES 2.0 นั้นค่อนข้างง่าย ในโปรแกรมแสดงภาพ ให้สร้าง เมทริกซ์การเปลี่ยนรูปแบบอื่น (เมทริกซ์การหมุน) แล้วรวมเข้ากับการฉายภาพและ เมทริกซ์การแปลงมุมมองกล้อง:
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); }
หากรูปสามเหลี่ยมไม่หมุนหลังจากทำการเปลี่ยนแปลงดังกล่าว อย่าลืมแสดงความคิดเห็น
GLSurfaceView.RENDERMODE_WHEN_DIRTY
ตามที่อธิบายไว้ในส่วนถัดไป
เปิดใช้การแสดงผลแบบต่อเนื่อง
หากคุณปฏิบัติตามอย่างเคร่งครัดพร้อมกับโค้ดตัวอย่างในชั้นเรียนนี้จนถึงจุดนี้ โปรด
อย่าลืมแสดงความคิดเห็นในบรรทัดที่ตั้งค่าโหมดการแสดงผลให้วาดเฉพาะเมื่อพื้นที่สกปรก มิฉะนั้น OpenGL
หมุนรูปร่างทีละส่วนเท่านั้น จากนั้นรอให้มีการเรียกไปยัง requestRender()
จากคอนเทนเนอร์ 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); }
คุณควรมีสิ่งนี้ ยกเว้นกรณีที่มีการเปลี่ยนแปลงออบเจ็กต์โดยไม่มีการโต้ตอบของผู้ใช้ แล้ว โปรดเตรียมยกเลิกความคิดเห็นเกี่ยวกับโค้ดนี้ เพราะบทเรียนถัดไปจะทำให้สามารถใช้การโทรนี้ได้ อีกครั้ง