Saturday, March 15, 2014

OpenGL ES 2.0 trên android - Áp dụng phép chiếu và camera

Áp dụng phép chiếu và camera

Trong môi trường OpenGL ES, phép chiếu và máy quay cho phép bạn hiển thị các đối tượng hình vẽ theo cách giống cách bạn nhìn thấy đối tượng vật lý với đôi mắt của bạn. Mô phỏng vật lý này được thực hiển với biến đối toán học của tọa độ hình vẽ:
·         Chiếu - chuyển đổi này điều chỉnh tọa độ của đối tượng được vẽ dựa trên chiều rộng và chiều cao của GLSurfaceView nơi chúng được hiển thị. Mà không cần tính toán này, các đối tượng được vẽ bởi OpenGL ES đang sai lệch bởi tỷ lệ đồng đều của cửa sổ xem. Một chuyển đổi chiếu thường chỉ phải được tính toán khi tỷ lệ của khung nhìn OpenGL được thành lập hoặc thay đổi trong onSurfaceChanged() của renderer của bạn. Để biết thêm thông tin về OpenGL ES dự và phối hợp ánh xạ, xem bản đồ tọa độ cho các đối tượng được vẽ.
·         Camera - chuyển đổi này điều chỉnh tọa độ của đối tượng được vẽ dựa trên một vị trí máy quay ảo. Điều quan trọng cần lưu ý là OpenGL ES không định nghĩa một đối tượng máy ảnh thực tế, nhưng thay vì cung cấp phương pháp hữu ích mà mô phỏng một máy ảnh bằng cách biến đổi màn hình hiển thị của các đối tượng vẽ. Một biến đổi camera có thể được tính toán một lần khi bạn thiết lập GLSurfaceView của bạn, hoặc có thể thay đổi tự động dựa trên các hành động sử dụng hay chức năng ứng dụng của bạn.
Bài học này mô tả làm thế nào để tạo ra một chiếu và xem máy ảnh và áp dụng nó cho Shapes được vẽ trong GLSurfaceView của bạn.

1.1.   Định nghĩa phép chiếu

Dữ liệu cho một biến đổi của phép chiếu được tính toán trong hàm onSurfaceChanged() của lớp GLSurfaceView.Renderer. Ví dụ dưới đây lấy chiều cao và rộng của GLSurfaceView và sử dụng để chứa biến đổi ma trận phép chiếu sử dụng hàm Matrix.frustumM().
@Override
public void onSurfaceChanged(GL10 unused, int width, int height) {

    GLES20.glViewport(0, 0, width, height);

    float ratio = (float) width / height;

    // this projection matrix is applied to object coordinates
    // in the onDrawFrame() method
    Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
}
Mã này chứa một ma trận chiếu, mProjectionMatrix mà bạn có thể kết hợp với sự chuyển đổi camera quan sát trong hàm onDrawFrame(), được thể hiện trong phần tiếp theo.
Lưu ý: Chỉ cần áp dụng một phép chiếu cho đối tượng vẽ của bạn, nếu không kết quả sẽ là một màn hình trống rỗng. Nói chung, bạn cũng phải áp dụng các chuyển camera để cho bất cứ điều gì để hiển thị trên màn hình.

1.2.   Định nghĩa một Camera

Hoàn tất quá trình chuyển đối tượng vẽ của bạn bằng cách thêm một biến đổi camera như một phần của quá trình vẽ. Trong mã ví dụ sau đây, việc chuyển đổi camera được tính toán bằng cách sử dụng Matrix.setLookAtM () và sau đó kết hợp với ma trận chiếu tính trước đó. Các ma trận biến đổi kết hợp này sau đó được thông qua để vẽ ra shape.
@Override

public void onDrawFrame(GL10 unused) {

    ...

    // Set the camera position (View matrix)
    Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

    // Calculate the projection and view transformation
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);

    // Draw shape
    mTriangle.draw(mMVPMatrix);
}

1.3.   Áp dụng phép chiếu và camera

Để sử dụng chiếu kết hợp với camera ma trận biến đổi thể hiện trong phần xem trước, chỉnh sửa hàm draw () của đối tượng đồ họa của bạn để chấp nhận các ma trận biến đổi kết hợp và áp dụng nó vào shape:
public void draw(float[] mvpMatrix) { // pass in the calculated transformation matrix

    ...

    // get handle to shape's transformation matrix
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");

    // Pass the projection and view transformation to the shader
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

    // Draw the triangle
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
    ...
}
Một khi bạn đã tính toán một cách chính xác và áp dụng phép chiếu với camera chuyển đổi, các đối tượng đồ họa của bạn được rút ra theo tỷ lệ chính xác và sẽ giống như thế này:
Figure 1. Triangle drawn with a projection and camera view applied.
Bây giờ bạn có một ứng dụng hiển thị shape của bạn với tỷ lệ chính xác, đã đến lúc để thêm chuyển động cho hình của bạn.

No comments:

Post a Comment