2012-01-17 8 views
5

Tôi đang làm việc với Android và OpenGL ES 2.0 và tôi đang gặp vấn đề mà tôi không thể thực sự đưa ra thành một câu hỏi chắc chắn. Trong hình ảnh, http://i.imgur.com/XuCHF.png, về cơ bản tôi có một hình dạng để đại diện cho một con tàu ở giữa và khi nó được di chuyển sang một bên nó được kéo dài về phía điểm biến mất. Những gì tôi muốn hoàn thành là để con tàu duy trì hầu hết hình dạng của nó khi nó được di chuyển. Tôi tin rằng nó có thể là do ma trận của tôi, nhưng mọi tài nguyên tôi đã nhìn dường như sử dụng cùng một phương pháp.Các vấn đề về Máy ảnh OpenGL ES 2.0

//Setting up the projection matrix 
final float ratio = (float) width/height; 
final float left = -ratio; 
final float right = ratio; 
final float bottom = -1.0f; 
final float top = 1.0f; 
final float near = 1.0f; 
final float far = 1000.0f; 
Matrix.frustumM(projection_matrix, 0, left, right, bottom, top, near, far); 

//Setting the view matrix 
Matrix.setLookAtM(view_matrix, 0, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f); 

//Setting the model matrix 
Matrix.setIdentityM(model_matrix, 0); 
Matrix.translateM(model_matrix, 0, 2f, 0f, 0f); 

//Setting the model-view-projection matrix 
Matrix.multiplyMM(mvp_matrix, 0, view_matrix, 0, model_matrix, 0); 
Matrix.multiplyMM(mvp_matrix, 0, GL.projection_matrix, 0, mvp_matrix, 0); 
GLES20.glUniformMatrix4fv(mvp_matrix_location, 1, false, mvp_matrix, 0); 

Các shaders là rất cơ bản cũng như:

private final static String vertex_shader = 
     "uniform mat4 u_mvp_matrix;" 
    + "attribute vec4 a_position;" 
    + "void main()" 
    + "{" 
    + " gl_Position = u_mvp_matrix * a_position;" 
    + "}"; 

private final static String fragment_shader = 
     "precision mediump float;" 
    + "void main()" 
    + "{" 
    + " gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);" 
    + "}"; 

Bất kỳ suy nghĩ/cái nhìn sâu sắc được đánh giá rất nhiều.

Cảm ơn.

Trả lời

7

Điều đó là bình thường - đó là cách bố cục phối cảnh trông như thế nào. Mặc dù trong trường hợp của bạn nó trông thực sự kéo dài một - với lĩnh vực rộng của xem.

Hãy thử sử dụng thay vì frustumM phương pháp perspectiveM (projection_matrix, 0, 45.0f, tỷ lệ, gần, xa). Hoặc nếu bạn phải sử dụng frustumM, tính toán trái/phải/dưới/đầu như thế này:

float fov = 60; // degrees, try also 45, or different number if you like 
top = tan(fov * PI/360.0f) * near; 
bottom = -top; 
left = ratio * bottom; 
right = ratio * top; 
+0

Cảm ơn bạn vì điều này! Tôi đã đập đầu tôi cố gắng tìm ra cách thay đổi quan điểm một cách có ý nghĩa, cho đến khi tôi gặp câu trả lời này. Tôi đã thiếu trường logic xem. Đã có một thời điểm Eureka khi tôi nhìn thấy câu trả lời của bạn. –

0

Nếu bạn không muốn bất kỳ tác dụng quan điểm ở tất cả, sau đó sử dụng Matrix.orthoM thay vì Matrix.frustumM.

Để chỉ làm cho hiệu ứng phối cảnh kém hơn, bạn cần phải giảm trường xem - Tức là, tăng near hoặc mang lại topbottom gần bằng không. (Bạn có thể muốn right = top * ratio, và tương tự với left nếu bạn đang đi để fiddle với topbottom giá trị.)