Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OpenGL ES 2.0相机问题_Android_Opengl Es_Matrix_Opengl Es 2.0 - Fatal编程技术网

Android OpenGL ES 2.0相机问题

Android OpenGL ES 2.0相机问题,android,opengl-es,matrix,opengl-es-2.0,Android,Opengl Es,Matrix,Opengl Es 2.0,我正在使用Android和OpenGL ES 2.0,我遇到了一个我无法真正表述为一个可靠问题的问题。在图像中,我基本上有一个形状来表示一艘船在中间,当它移动到一侧时,它会向消失点伸展。我想做的是让船在移动时保持大部分形状。我相信这可能是由于我的矩阵,但我看过的每一个资源似乎都使用相同的方法 //Setting up the projection matrix final float ratio = (float) width / height; final float left = -rati

我正在使用Android和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);
着色器也是非常基本的:

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);"
     + "}";
非常感谢您的任何想法/见解


谢谢。

这很正常-透视投影应该是这样的。虽然在你的情况下,它看起来真的很伸展一-与广泛的视野

尝试使用而不是
trustomm
方法
perspectiveM
(投影矩阵,0,45.0f,比率,近,远)。 或者,如果必须使用平截头体,请按如下方式计算左/右/下/上:

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;

如果您根本不想要任何透视效果,请使用而不是Matrix.frustumM


为了使透视效果不那么极端,您需要缩小视野——即,将
增加到接近
或使
顶部
底部
接近于零。(您可能需要
right=top*ratio
,如果您要处理
top
bottom
值,也可能需要
left

谢谢!我一直在绞尽脑汁试图找出如何以一种有意义的方式改变视角,直到我找到了这个答案。我错过了视野逻辑。当我看到你的回答时,我感到非常高兴。