Trong bài trước Học android 3d với opengles (bài 2) chúng ta đã hiểu như thế nào để vẽ 1 hình đơn giản lên trên screen với opengles. Trong phần này sẽ hướng dẫn bạn quay Triangle quanh một trục.

B1: Trước tiên trong lớp GLRenderer chúng ta thêm 1 biến như sau:

private float angle;

và cài đặt phương thức setAngle() cho nó

public void setAngle(float angle) {
this.angle = angle;
}

Và thêm lệnh gl.glRotatef(angle, 0f, 1f, 0f); trước triangle.onDrawGL(gl); Trong method onDrawFrame(GL10 gl). Ở đây chúng ta sẽ quay triangle quanh trục y, các trục khác cũng tương tự.

B2: Trong lớp Android3Dview ta thêm lệnh như dòng bên dưới như sau:

public boolean onTouchEvent(final MotionEvent event) {
queueEvent(new Runnable() {
public void run() {
glRenderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);
glRenderer.setAngle(event.getX()/10);//thêm lệnh này
}
});
return true;
}

OK: Bây giờ bạn chạy chương trình khi click trên screen thì tam giác sẽ quay và tùy thuộc vào angle (tùy thuộc vào vị trí bạn click trên trục x).







B3: Ở hình bên trên hình tam giác quay liên tục khi bạn click, để dừng quay chúng ta phải reset lại matrix mỗi khi gọi onDrawFrame() method. Vì vậy chúng reset và luôn luôn quay với góc qay khi thiết lập. (2D thì ta nhìn thấy hình tam giác là đứng im).

public void onDrawFrame(GL10 gl) {

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


gl.glLoadIdentity();//Bỏ sung để reset matrix

// clear the color buffer to show the ClearColor we called above...
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

gl.glRotatef(angle, 0f, 1f, 0f);

triangle.onDrawGL(gl);

}
Bạn chuyển event.getX()/10 thành event.getX() trong onTouchEvent() của lớp Android3DView để góc quay được rộng hơn.

glRenderer.setAngle(event.getX());

Bây giờ khi bạn chạy chương trình thì tringle sẽ quay khi bạn touch on screen và sẽ không tự quay như trước nữa.

B4: Để bạn cảm nhận rõ hơn khi quay hình ta có thể tạo thêm 1 hình tam giác bên ngoài với màu khác.

Ta tại thêm 1 lớp Triangle1.java với nội dung như lớp Triangle.java nhưng khác ở phần thiết lập màu và tọa độ các đỉnh.

package com.thuan.android3d;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;

public class Triangle1 {

private FloatBuffer floatBuffer;



public Triangle1() {
initialize();
}

public void initialize() {

float vertices[] = { //Khác
-0.7f, -0.7f, 0.0f, // V1 - first vertex
0.7f, -0.7f, 0.0f, // V2 - second vertex
0.0f, 0.7f, 0.0f // V3 - third vertex
};

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

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

}

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

gl.glColor4f(1.0f, 0.0f, 0.0f, 0.5f);// à Khác

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

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

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}

}


Và trong lớp GLRenderer ta cũng khai báo và khởi tạo tương tự như lớp Triangle,

Và trong onDrawFrame()

public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
gl.glClearColor(_red, _green, _blue, 1.0f);


gl.glLoadIdentity();

// clear the color buffer to show the ClearColor we called above...
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

triangle1.onDrawGL(gl);

gl.glRotatef(angle, 0f, 1f, 0f);

triangle.onDrawGL(gl);


}

Và khi chạy chương trình





Chủ đề tương tự: