Á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