Phép biến đổi (Transformations):

Một phần của tài liệu lập trình 3d ứng dụng trên nền tảng android (Trang 72 - 77)

Chương 5: Áp dụng OpenGLES để tạo ứng dụng 3D trên Andro

5.5Phép biến đổi (Transformations):

Phần này sẽ giới thiệu về cách chuyển đổi hình theo các cách khác nhau. Các phép biến đổi:

 Phép tỉ lệ - glScalef  Phép dịch - glTranslatef  Phép quay - glRotatef

Thực hiện: khởi tạo 2 biến dùng để quay theo trục x và y:

float xrot=0.0f; float yrot=0.0f;

Khởi tạo một tam giác.

float[] triangle = {

-0.25f, -0.25f, 0.0f, 0.25f, -0.25f, 0.0f,

-0.25f, 0.25f, 0.0f, };

Khởi tạo một mảng màu:

float[] colors = { 1.0f, 0.0f, 0.0f, 1.0f, // point 0 red 0.0f, 1.0f, 0.0f, 1.0f, // point 1 green 0.0f, 0.0f, 1.0f, 1.0f, // point 2 blue 1.0f, 1.0f, 1.0f, 1.0f, // point 3 white }; Khởi tạo một hình vng: float[] square = { -0.25f, -0.25f, 0.25f, -0.25f, -0.25f, 0.25f, 0.25f, 0.25f, };

Ta sẽ vẽ một tam giác ở phía bên trái màn hình và một hình vng ở phía bên phải, tam giác sẽ được tơ bóng mịn và hình vng sẽ được tơ bóng.

Các thiết lập trên tam giác:

gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glShadeModel(GL10.GL_SMOOTH);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangle); gl.glColorPointer(4, GL10.GL_FLOAT, 0, colors);

gl.glEnableClientState (GL10.GL_VERTEX_ARRAY); gl.glEnableClientState (GL10.GL_COLOR_ARRAY);

Có 3 phép chuyển đổi sử dụng bởi các hàm glTranslatef, glScalef và glRotatef. Các giá trị f ở cuối mỗi hàm thể hiện biến đầu vào mang giá trị float.

Sau khi vẽ tam giác chúng ta khơng muốn các hình sau đó bị ảnh hưởng bởi việc chuyển đổi. Hàm glPushMatrix và glPopMatrix được sử dụng để sao chép thêm một ma trận hiện thời đưa lên đỉnh ngăn xếp và loại bỏ ma trận hiện thời ra khỏi ngăn xếp.

gl.glPushMatrix();

Hàm glTranslatef với 3 tham số cho truc x, y, z để dịch chuyển đối tượng (dịch sang trái 0.25 đơn vị và lên 0.5 đơn vi):

gl.glTranslatef(0.25f, 0.5f, 0.0f);

Hàm glScalef với 3 tham số xác định tỉ lệ của đối tượng theo 3 trục x, y, z (giảm kích thước của tam giác xuống một nửa):

Hàm glRotatef với 4 tham số là góc quay và 3 tham số đại diện cho 3 trục x, y, z để quay đối tượng (quay đối tượng theo 1 góc xrot theo trục x):

gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);

Vẽ tam giác:

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

Phục hồi ma trân về thời điểm ban đầu: gl.glPopMatrix();

Tiếp theo sẽ khơng sử dụng mảng màu cho hình nên sẽ khóa chức năng này lại: gl.glDisableClientState(GL10.GL_COLOR_ARRAY);

Tiếp theo ta sẽ vẽ một hình vng được tơ bóng: gl.glShadeModel(GL10.GL_FLAT);

Chú ý rằng khi khởi tạo con trỏ đỉnh, sử dụng 2 tham số đầu tiên đại diện cho mỗi đỉnh:

gl.glVertexPointer(2, GL10.GL_FLOAT, 0, square);

Thay vì sử dụng mảng màu ta có thể sử dụng chức năng glColor4f hoặc (adsbygoogle = window.adsbygoogle || []).push({});

glColor4x :

gl.glColor4f(0.25f, 0.25f, 0.75f, 1.0f);

Việc chuyển đổi hình vng cũng tương tự như hình tam giác phía trên gl.glPushMatrix();

gl.glTranslatef(0.75f, 0.5f, 0.0f); gl.glScalef(0.5f, 0.5f, 0.5f);

gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);

gl.glDrawArrays(GL10.GL_TRIANGLES_STRIP, 0, 4); gl.glPopMatrix();

gl.glFlush(); gl.glFinish();

Để cho phép tạo ra hình ảnh động, sử dụng chức năng idle, chức năng này được gọi là vịng lặp chính.

Để tăng góc quay của đối tượng trên trục x và truc y cũng như vẽ lại màn hình sau khi thay đổi, gọi hàm glutPostRedisplay hoặc ugPostRedisplay:

private void idle()

{

xrot += 2.0f; yrot += 3.0f;

GLU.gluPostRedisplay(); }

Thông báo cho thư viện GLUT|ES / UG là chức năng idle được sử dụng bằng lời gọi hàm glutIdleFunc / ugIdleFunc.

GLU.gluIdleFunc(idle);

Hình 19 – Kết quả phép biến đổi

Một phần của tài liệu lập trình 3d ứng dụng trên nền tảng android (Trang 72 - 77)