Ở bài trước Học android 3d với opengles step by step(bài 1) ta đã xây dựng xong bộ khung chương trình. Ở bài này ta xây dựng vẽ 1 hình tam giác lên trên màn hình và khi ontouch thì màu màn hình thay đổi tùy thuộc vào tọa độ touch.

B1: Trước tiên ta khai báo 3 biến màu trong lớp GLRenderer như sau:

private float _red = 0.9f;
private float _green = 0.2f;
private float _blue = 0.2f;

Và cài đặt phương thức setColor():

public void setColor(float r, float g, float b) {
_red = r;
_green = g;
_blue = b;
}

-->> Trong phương thức onDrawFrame(GL10 gl) ta thêm 2 hàm glClearColor glClear() với ý nghĩa như chú thích bên dưới.

public void onDrawFrame(GL10 gl) {

//chọn màu để xóa nền (tức là sẽ phủ nền bằng màu này)
gl.glClearColor(_red, _green, _blue, 1.0f);

// xóa mọi pixel để ta biểu diễn màu ở lệnh trên
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

}

B2: Trong lớp Android3Dview Ta thêm phương thức onTouchEvent như sau:

public boolean onTouchEvent(final MotionEvent event) {
queueEvent(new Runnable() {
public void run() {
glRenderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);
}
});
return true;
}

Ta tạo ra một đối tượng mới ẩn danh của Runnable. Trong đó phương thức run () gọi setcolor () của lớp GLRenderer với một chút tính toán phụ thuộc vào các tọa độ MotionEvent.
=> Bây giờ ta chạy chương trình, chúng ta sẽ thấy thay đổi màu màn hình khi ta click các vị trí khách nhau trên màn hình.

B3: Ta tạo một lớp tam giác Triangle. Trước khi đi xâu vào lớp này thì ta tìm hiểu một chút liên quan đến tọa độ trong Opengl:

Trong hệ tọa độ đã được nói qua ở phần trên. Ở đây tôi nói rõ hơn bằng hình bên trên ta sử dụng hệ tọa độ 3 chiều X, Y, Z. Trục x chạy từ trái qua phải, trục Y chạy từ dưới lên trên , trục Z chạy từ trong ra ngoài.
Khi 1 tọa độ VD: A(x,y,0) khi z==0 ở bky thời điểm nào à Ta có 2D.
Hình tam giác được định nghĩa bởi 3goc. Tọa độ các góc không được đo bằng Pixel, ta sử dụng dữ liệu float để mô tả các giá trị, và mỗi thành phần sẽ có quan hệ với 1 cái khác.
Nếu chiều dài 1 slide là 1.0f và một cái là 0.5f thì nghĩa của nó là cái sau =1/2 cái trước. Và nó được hiển thị độc lập với ViewPort (màn hình) khi ta chạy. Khi ta sử dụng 2D thì Camera (ở đây nói về phần 2 của OPENGL <độ sáng>) đối diện với màn hình. Ta đưa lại gần thì hình to ra, đưa ra xa thì hình nhỏ lại (Perspective Projection).


  • Và đây là lớp Triangle.java


package com.thuan.android3d;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.opengles.GL10;

public class Triangle {

private FloatBuffer floatBuffer; (1)

public Triangle() {
initialize();
}

public void initialize() {

float vertices[] = { (2)
-0.5f, -0.5f, 0.0f, // V1 - first vertex
0.5f, -0.5f, 0.0f, // V2 - second vertex
0.0f, 0.5f, 0.0f // V3 - third vertex
};

ByteBuffer bbb=ByteBuffer.allocateDirect(vertices.length*4); (3)
bbb.order(ByteOrder.nativeOrder()); (4)
floatBuffer=bbb.asFloatBuffer(); (5)

floatBuffer.put(vertices);(6)
floatBuffer.position(0); (7)

}

public void onDrawGL(GL10 gl) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); (8)

gl.glColor4f(0.0f, 1.0f, 0.0f, 0.5f); (9)

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, floatBuffer); (10)

gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3); (11)

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
}


  • Bây giờ chúng ta tìm hiểu từng lệnh sau:


  1. -> Khai báo vùng đệm kiểm float rồi sau đó ta sẽ đổ tọa độ các đỉnh vào vùng đệm này.
  2. -> Khai báo các đỉnh của hình tam giác như hình bên trên
  3. -> Mỗi kiểu float có 4 bytes nên ta chỉ định cho mỗi góc =4bytes
  4. -> Trỏ bộ nhớ đến bộ đệm byte
  5. -> Đổ các đỉnh vào bộ đệm
  6. -> Thiết lập con trỏ tới vị trí bắt đầu của bộ đệm
  7. -> Enable client trước khi vẽ
  8. -> Thiết lập màu cho tam giác

(10)->Dùng để chỉ tới vùng đệm của ta (tham số thứ nhất chỉ số tọa độ các đỉnh, tham số thứ 2 chỉ kiểu dữ liệu ở vùng đệm, tham số thứ 3 là offset trong mảng được sử dụng cho các đỉnh, ở đây các đỉnh không sử dụng thêm dữ liệu nào vì vậy mà offset =0, và tham số cuối cùng là vùng đệm chứa các đỉnh).
(11)-> Nói với OpenGL để vẽ dải tam giác tìm thấy trong bộ đệm cung cấp dòng trên

=> Ngoài ra ta phải sửa một chút trong lớp GLRenderer như sau

private Triangle triangle;

public void onDrawFrame(GL10 gl) {

//chọn màu để xóa nền (tức là sẽ phủ nền bằng màu này)

gl.glClearColor(_red, _green, _blue, 1.0f);

// xóa mọi pixel để ta biểu diễn màu ở lệnh trên

gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

triangle.onDrawGL(gl);//thêm dòng lệnh

}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
triangle=new Triangle();
}
=>Và bây giờ bạn chạy thử chương trình sẽ được hình sau:



Chủ đề tương tự: