我正在写我的第一个opengl es 2.0应用程序,我对Matrix.setLookAt的用途感到困惑。

我正在运行一些代码,该代码绘制的一些对象的视图中心设置为0,0,但我想平移视图以使中心位于世界坐标的其他位置,例如5,5。

我需要在glOrtho和setLookAt中传递什么以实现此目的?如果我将视图的中心设置为0,0并在视口上绘制线,则效果很好。如果将中心设置为0.25、0,则这些线将显示在左侧,如下面的屏幕转储所示。这些线应跨视口延伸。

我究竟做错了什么?

我的代码:
着色器代码:

private static final String vertexShader =
        "uniform mat4 uMVPMatrix;\n"
        + "attribute vec4 aPosition;\n"
        + "attribute vec4 aColor;\n"
        + "varying vec4 vColor;\n"
        + "vec4 temp;"
        + "void main() {\n"
        + "  temp = aPosition;\n"
        + "  gl_Position = uMVPMatrix * temp;\n"
        + "  vColor = aColor;\n"
        + "}\n";

private static final String fragmentShader =
        "precision mediump float;\n"
        + "varying vec4 vColor;\n"
        + "void main() {\n"
        + "  gl_FragColor = vColor;\n"
        + "}\n";


有效的onDraw代码(实际上分布在多个地方)

    // center of view should be at 0.25, 0. Height of view 1.0, width determined by ratio of viewport

    Matrix.orthoM(mProjMatrix, 0, -0.126471, 0.626471, -0.5, 0.5, -1, 7);
    Matrix.setLookAtM(mVMatrix, 0, 0.25, 0.0, -5, 0.25, 0.0, 0f, 0f, 1.0f, 0.0f);
    Matrix.setIdentityM(mMMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
    GLES20.glUniformMatrix4fv(MVPMatrixHandle, 1, false, MVPMatrix, 0);
    GLES20.glVertexAttrib4f(aColorHandle, 0f, 0f, 0f, 1f);      // constant color
    lineVertices.position(0);
    GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, 0, lineVertices);
    GLES20.glEnableVertexAttribArray(aPositionHandle);
    GLES20.glDrawArrays(GLES20.GL_LINES, 0, lineCount*2);


LineVertices使用x:y坐标绘制线:

从-0.126474:-0.250000到0.626474:-0.250000的行

从-0.126471:0.000000到0.626471:0.000000的行

从-0.126474:0.250000到0.626474:0.250000的行

最佳答案

这是预期的行为。


投影矩阵占用一部分空间,并将其映射到NDC立方体。对于拼写法而言,这只是一个障碍(没有视锥)。代码定义的块跨度[-0.126471, 0.626471][-0.5, 0.5][-1, 7]。如果不改变源空间,则会从左到右精确地绘制线条。
现在考虑setLookAtM的作用:按照惯例,在应用了Modelview之后,查看器位于[0,0,0]处,并朝[0,0,-1]方向看。观众正在x方向上为0.25移开(尝试构想;这与将所有行向左移动相同)。如果您想像以前那样画线,则代码还必须移动其x坐标(+0.25)。


阅读here以获得gluLookat的技术说明;它实际上是平移,后跟旋转。确保在songho或其他位置签出OpenGL的空格。

10-04 23:38