2012-01-17 24 views
5

Sto lavorando con Android e OpenGL ES 2.0 e sto riscontrando un problema che non riesco a formulare in una domanda solida. Nell'immagine, http://i.imgur.com/XuCHF.png, ho fondamentalmente una forma per rappresentare una nave nel mezzo e quando viene spostata lateralmente viene allungata verso il punto di fuga. Quello che voglio ottenere è che la nave mantenga la maggior parte della sua forma quando viene spostata. Credo che potrebbe essere dovuto alle mie matrici, ma ogni risorsa che ho guardato sembra utilizzare lo stesso metodo.Problemi con OpenGL ES 2.0 Camera

//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); 

Gli shader sono molto semplici così:

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);" 
    + "}"; 

Ogni pensiero/visione è molto apprezzato.

Grazie.

risposta

7

Questo è normale - è così che dovrebbe apparire la proiezione prospettica. Anche se nel tuo caso sembra davvero allungato - con ampio campo visivo.

Provare a utilizzare al posto del metodo frustumMperspectiveM (projection_matrix, 0, 45.0f, rapporto, vicino, lontano). O se è necessario utilizzare frustumM, calcolare sinistra/destra/in basso/alto in questo modo:

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

Grazie per questo! Ho battuto la testa cercando di capire come cambiare la prospettiva in modo significativo, fino a quando ho incontrato questa risposta. Mi mancava la logica del campo visivo. Ho avuto un momento Eureka quando ho visto la tua risposta. –

0

Se non si desidera alcun effetto prospettico a tutti, quindi utilizzare Matrix.orthoM invece di Matrix.frustumM.

Per rendere l'effetto di prospettiva meno estremo, è necessario ridurre il campo di vista, ovvero aumentare near oppure portare top e bottom più vicino allo zero. (Probabilmente vuoi right = top * ratio e allo stesso modo con left se hai intenzione di giocherellare con i valori top e bottom.)