2012-01-17 9 views
5

Pracuję z Androidem i OpenGL ES 2.0 i mam problem, którego naprawdę nie mogę sformułować na stałe pytanie. Na obrazku, http://i.imgur.com/XuCHF.png, zasadniczo mam kształt reprezentujący statek w środku, a kiedy jest on przesunięty na bok, zostaje rozciągnięty w kierunku punktu zbiegu. To, co chcę osiągnąć, to sprawić, by statek utrzymywał większość swojego kształtu, gdy jest poruszany. Sądzę, że może to wynikać z moich matryc, ale każdy zasób, który wyszukałem, wydaje się używać tej samej metody.Problemy z aparatami 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); 

shaderów są bardzo proste, a także:

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

jakieś przemyślenia/wgląd jest mile widziana.

Dzięki.

Odpowiedz

7

To normalne - tak powinna wyglądać perspektywa. Chociaż w twoim przypadku wygląda na naprawdę rozciągniętą - z szerokim polem widzenia.

Spróbuj użyć zamiast frustumM metody perspectiveM (projection_matrix, 0, 45.0f, ratio, near, far). Albo jeśli trzeba użyć frustumM obliczyć lewy/prawy/dolny/górny takiego:

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

Dziękuję za to! Waliłem w głowę, próbując dowiedzieć się, jak zmienić perspektywę w znaczący sposób, dopóki nie spotkałem się z tą odpowiedzią. Brakowało mi logiki pola widzenia. Miałem chwilę Eureki, kiedy zobaczyłem twoją odpowiedź. –

0

Jeśli nie chcesz żadnego wpływu perspektywiczny w ogóle, a następnie użyć Matrix.orthoM zamiast Matrix.frustumM.

Aby efekt perspektywy był mniej ekstremalny, należy zmniejszyć pole widzenia - czyli zwiększyć wartość near lub przybliżyć top i bottom bliżej zera. (Prawdopodobnie chcesz right = top * ratio, i podobnie z left, jeśli chcesz skrzypić z wartościami top i bottom.)