Проблемы с камерой OpenGL ES 2.0 - PullRequest
5 голосов
/ 17 января 2012

Я работаю с Android и OpenGL ES 2.0, и у меня возникла проблема, которую я не могу сформулировать как серьезный вопрос. На изображении http://i.imgur.com/XuCHF.png, у меня в основном фигура, изображающая корабль посередине, и когда он перемещается в сторону, он растягивается к точке схода. То, чего я хочу достичь, это заставить корабль поддерживать большую часть своей формы при движении. Я полагаю, что это может быть связано с моими матрицами, но каждый ресурс, который я посмотрел, использует один и тот же метод.

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

Шейдеры также очень просты:

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

Любые мысли / идеи очень ценятся.

Спасибо.

Ответы [ 2 ]

7 голосов
/ 17 января 2012

Это нормально - так должна выглядеть перспективная проекция. Хотя в вашем случае он выглядит действительно растянутым - с широким полем зрения.

Попробуйте использовать вместо frustumM метод perspectiveM (projection_matrix, 0, 45.0f, коэффициент, ближний, дальний). Или, если вы должны использовать frustumM, рассчитайте левую / правую / нижнюю / верхнюю часть следующим образом:

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 голосов
/ 17 января 2012

Если вам вообще не нужен эффект перспективы, используйте Matrix.orthoM вместо Matrix.frustumM.

Чтобы сделать эффект перспективы менее экстремальным, вам нужно уменьшить поле зрения - то есть увеличить near или приблизить top и bottom к нулю.(Вы, вероятно, хотите right = top * ratio, и аналогично left, если вы собираетесь возиться со значениями top и bottom.)

...