OpenGL ES 2.0 相机问题

5
我正在使用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

这是正常的 - 这就是透视投影应该看起来的样子。尽管在您的情况下,它看起来确实很拉伸 - 具有宽阔的视野。

尝试使用 perspectiveM(projection_matrix, 0, 45.0f, ratio, near, far) 方法代替 frustumM 方法。 或者如果您必须使用 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;

谢谢您!我一直在苦苦思索如何以有意义的方式改变视角,直到遇到了这个答案。我错过了视野逻辑。当我看到您的答案时,我有了一个顿悟时刻。 - Roy Sharon

0

如果您不想要任何透视效果,那么请使用Matrix.orthoM而不是Matrix.frustumM。

如果只是想减轻透视效果,您需要减小视场角--也就是增加near或将topbottom靠近零点。(您可能希望right = top * ratio,如果您要调整topbottom的值,则同样适用于left。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接