【问题标题】:Applying Orthographic projection or frustum effecting normalised coordinates?应用正交投影或平截头体影响归一化坐标?
【发布时间】:2013-04-06 21:21:10
【问题描述】:

我知道标准化坐标应该是-1(左)+1(右)和-1(下)+1(上)

像这样:

但是在应用这个之后:

来自我的 onSurfaceChanged 方法

GLES20.glViewport(0, 0, width, height);
float ratio = (float) width / height;
Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

//The above line can be replaced with:
//Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
//But I get the same results with either frustumM or otrhoM

这在我的 onDrawFrame 方法中

Matrix.setLookAtM(mVMatrix, 0, 0, 0, 3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);

(然后我将 mMVPMatrix 传递到我的自定义类的 draw 方法中,在该方法中它被旋转和平移)。

但是,我的坐标似乎发生了变化——大致是这样的:

如您所见,x 坐标有所改变,-1 和 +1 不再是屏幕的边缘(在我目前使用的设备上,外边缘变为 -1.7 和 + 1.7)

Y坐标保持不变。

如果有人能指出我哪里出错了,不胜感激?我需要它应该是 -1 到 +1。

谢谢

【问题讨论】:

    标签: android opengl-es-2.0 coordinates coordinate-systems orthographic


    【解决方案1】:

    在我看来,这似乎是正确的。如果您的屏幕不是正方形,那么您确定要拉伸 x 轴使其表现得像正方形屏幕吗?因为如果你这样做了,那么如果你告诉 OpenGL 绘制一个正方形,它会在屏幕上显示为一个矩形,而不是当你的屏幕宽度比你的 x 轴边缘大于你的 y 轴边缘时如图所示,您的屏幕高度。这就是为什么你将 ratio 传递给投影,所以它知道如何正确地绘制东西。

    当您在屏幕上绘制一个常规正方形时会发生什么?是正方形还是长方形?

    【讨论】:

    • 嗯,是的,我明白你现在的意思了,我写了一个四边形渲染方法,你传入坐标(如 drawQuad(x,y)),其中 x 和 y 被指定为“正常” ' 屏幕坐标(左上角为 0,0)。然后该方法转换这些,以便可以绘制它们。但是,自从应用投影以来,如果我指定 0,0,如果你明白我的意思,它就不会再绘制在左上角了,所以我试图理解以解决这个问题。基本上,如果我将 0 指定为 X 坐标,那么我需要渲染方法以某种方式将其解释为屏幕的左侧。除非有一个更简单的方法来做到这一点.....
    • 感谢您的回答,尽管它解释得很好。我会问另一个关于为不同的 res/ratio 开发的问题。我习惯于根据屏幕宽度和高度缩放我的精灵来进行开发,因此它们相对于任何屏幕显示相同的大小。 (即,无论游戏在何种分辨率或比例屏幕上运行,游戏都显示相同的大小) - 但我看到人们经常谈论在更宽的屏幕上“显示更多游戏区域”,这是我发现的一个概念很难掌握。
    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多