0

我最近开始使用 openGL,因为普通视图中的画布不再足以满足我的需求。但我似乎无法理解opengl中的坐标系。

当我制作一个底部坐标 y=0 的矩形时,我会在屏幕的上半部分得到一个矩形的结果。这是可以预料的。

但是,当我设置 y=0.25f 时,我预计矩形将是屏幕顶部的四分之一。但实际上它更少,例如 1/6 或 1/7。

或者当我尝试 y=0.375f(应该是屏幕的 1/8)时,结果类似于 1/11 或 1/12。some1 可以解释为什么会这样吗?我错过了什么。那么我怎样才能制作一个填充屏幕顶部 1/8 的矩形呢?

(我知道屏幕顶部和底部在放大时有 -+0.5f 坐标)

4

2 回答 2

3

这可能是由您的相机在您的视图矩阵中的位置引起的。回忆一下 OpenGL 中坐标系的方向:

  • +x 点向右
  • +y 向上
  • +z 指向屏幕外
  • (0,0,0) 在屏幕中央

要设置相机:

Matrix.setLookAtM(mVMatrix, 0, 0, 0, 2, 0f, 0f, 0f, 0f, 1.0f, 0f); 

// My camera is located at (0,0,2),
// it's looking toward (0,0,0)
// its top is pointing along (0,1,0) aka. Y-axis. 

如果我的矩形位于 XY 平面上的某个位置,即 Z 坐标为 0,那么我的相机在 Z 轴正方向上距它 2 个单位。从这个位置查看矩形使它看起来比预期的要小。要使矩形看起来更大,请尝试通过更改其在视图矩阵中的位置来将相机移近它。我将 Z 坐标从下面的 2 更改为 1:

Matrix.setLookAtM(mVMatrix, 0, 0, 0, 1, 0f, 0f, 0f, 0f, 1.0f, 0f); 

// My camera is located at (0,0,1),
// it's looking toward (0,0,0)
// its top is pointing along (0,1,0) aka. Y-axis. 
于 2013-06-25T19:45:24.693 回答
0

示例中的代码示例:

Android 培训 > 应用投影和相机视图

  1. 定义相机视图

    // Set the camera position (View matrix)
    Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    
    // Calculate the projection and view transformation
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
    

    在我的例子中产生一个 y 轴范围从 -1 到 +1 的坐标系。

  2. 定义投影

    @Override
    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    
        float ratio = (float) width / height;
    
        // this projection matrix is applied to object coordinates
        // in the onDrawFrame() method
        Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
    }
    

    修正窗口比例

于 2013-06-27T09:49:10.510 回答