Hiện kết quả từ 1 tới 3 của 3
Like Tree2Likes
  • 2 Post By contuhu

Chủ đề: Học android 3d với opengles step by step(bài 1)


  1. #1
    Thành Viên Mới Avatar của contuhu
    Tham gia
    Jul 2012
    Bài gửi
    14

    Học android 3d với opengles step by step(bài 1)

    Tài liệu này tham khảo từ nguồn Android Development tuy nhiên có nhiều bạn chưa biết nên tôi viết lại để những người mới tìm hiểu tham khảo thêm.
    - Phần đầu tiên của loạt bài này sẽ cung cấp cho bạn một giới thiệu ngắn đến thuật ngữ OpenGL và bước đầu tiên trong việc viết chương trình.
    ==> Hãy bắt đầu với thuật ngữ của OPENGL

    • Vertex (Đỉnh).

    Là một điểm trong không gian 3D trong OpenGl có thể chỉ là 2 tọa độ (x, y) hoặc nhiều tọa độ như (x, y, z, w) ở đó w là tùy chọn và mặc định nó có giá trị là 1.0, tương tự trục z cũng là tùy chọn và giá trị mặc định của nó là 0. Tất các các đối tượng được vẽ bởi các đỉnh hay chính là các điểm, do đó kho nói tới điểm cũng chính là 1 đỉnh

    • Triangle (Tam giác)

    Được tạo nên bởi 3 điểm, vì vậy trong OpenGL chúng ta có thể dùng 3 đỉnh để tạo nên 1 tam giác.

    • Polygon (Đa giác)

    Được tạo nên bởi nhiều hơn 2 điểm và tam giác cũng là 1 đa giác.

    • Primitives (Nguyên thủy, gốc)

    Nguyên thủy là một hình dạng đơn giản, giống như điểm, đường thẳng hoặc đa giác (bao gồm cả một hình tam giác). Một mô hình với 50.000 đỉnh chỉ là một mô hình, cho dù đó là một nguyên thủy hay không phụ thuộc vào cho dù đó là một đa giác duy nhất hoặc bao gồm nhiều đa giác.
    è Render:
    Thời gian để bạn đưa một cái j đó ra ngoài màn hình, có 2 phương thức để bạn làm điều này, 2 phương thức đó là:
    public abstract void glDrawArrays(int mode, int first, int count);

    public abstract void glDrawElements(int mode, int count, int type, Buffer indices); //

    Một số render cơ bản nhất:
    GL_POINTS: Render một điểm ra màn hình.
    GL_LINE_STRIP: Render một dãy các phân đoạn đường thẳng nối liền nhau, nhưng không nối điểm đầu và điểm cuối.
    GL_LINE_LOOP: Giống như GL_LINE_STRIP nhưng không nối điểm đầu và điểm cuối.
    GL_LINES: Render một đường thẳng.
    GL_TRIANGLES: Render một tam giác.
    GL_TRIANGLE_STRIP: Render một loạt các tam giác theo thứ tự VD: Ta có các đỉnh v0, v1, v2, v3, v4, v5 khi đó các tam giác được render là (v0, v1, v2) sau đó là (v2, v1, v3) (lưu ý thứ tự), tiếp theo là (v2, v3, v4) ...





    GL_TRIANGLE_FAN: Render một loạt các tam giác giống như GL_TRIANGLE_STRIP nhưng các tam giác được vẽ giống như một hình quạt dựa vào một gốc.





    ==> Nào bây giờ chúng ta bắt đầu tìm hiểu:
    B1: Chúng ta tạo 1 Project gọi là Tutorial3D, lớp Activity của ta cũng đặt tên tương tự -> Đây là lớp Activity của ta:Tutorial3DActivity

    package com.thuan.android3d;

    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;

    public class Android3DActivity extends Activity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new Android3DView(this));

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_android3 _d, menu);
    return true;
    }
    }

    --> Khối lệnh trên không có gì đặc biệt đúng không? => Ta chỉnh sửa trong onCreate() method như sau:
    thay lệnh setContentView(R.layout.activity_android3_d); bằng lệnh setContentView(new Android3Dview(this));


    B2: Ta tạo 1 lớp Android3Dview extends GLSurfaceView (Lớp GLSurfaceView của OpenGLES tương tự như lớp SurfaceView trong Android mà ta thường sử dụng).
    package com.thuan.android3d;

    import android.content.Context;
    import android.opengl.GLSurfaceView;



    public class Android3DView extends GLSurfaceView {


    public Android3DView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub

    }

    }
    - Ta khai báo biến đối tượng trong lớp Android3DView như sau

    private GLRenderer glRenderer;//Lớp GLRenderer sẽ đề cập sau

    Trong contructor của lớp này mình bổ xung thêm 2 lệnh như sau:
    glRenderer = new GLRenderer();
    setRenderer(glRenderer);// Để reder dữ liệu lên viewPort(screen)

    B3: Ta tạo lớp GLRenderer implements android.opengl.GLSurfaceView.Renderer
    Như sau:
    package com.thuan.android3d;

    import javax.microedition.khronos.egl.EGLConfig;
    import javax.microedition.khronos.opengles.GL10;

    import android.opengl.GLSurfaceView.Renderer;

    public class GLRenderer implements Renderer {

    public void onDrawFrame(GL10 gl) {
    // TODO Auto-generated method stub

    }

    public void onSurfaceChanged(GL10 gl, int width, int height) {
    // TODO Auto-generated method stub

    }

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    // TODO Auto-generated method stub

    }
    }
    Ta phải cài đặt 3 phương thức của lớp Renderer như trên:


    • onDrawFrame(GL10 gl): Là nơi mà tất cả các đối tượng được vẽ trong method này rồi đưa ra mỗi frame.
    • onSurfaceChanged(GL10 gl, int width, int height): .Được gọi khi surface Size thay đổi (Tức là vùng hình vuông mà toàn bộ dữ liệu được hiển thị trên đó )
    • onSurfaceCreated(GL10 gl, EGLConfig config): Được dùng để Load các tài nguyên và là nơi để khởi tạo chương trình.

    Chương trình này chạy lên thì sẽ không có gì cả vì ta mới xây dựng khung, trong đó chưa có thao tác gì cả

    Chủ đề tương tự:


  2. #2
    Thành Viên Mới Avatar của phamquocchinh
    Tham gia
    Oct 2012
    Bài gửi
    1
    Cám ơn bạn!!!!!!!!!!!!
    Thật là bổ ích.



  3. #3
    Thành Viên Mới Avatar của androidbeginer
    Tham gia
    Oct 2012
    Bài gửi
    4
    Cảm ơn bạn :D



Đánh dấu

Quyền viết bài

  • Bạn không thể gửi chủ đề mới
  • Bạn không thể gửi trả lời
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •