【问题标题】:Android Screen Ratios安卓屏幕比例
【发布时间】:2013-03-29 14:06:13
【问题描述】:

我在 Android 上使用 OpenGL ES 2.0,我和我这样初始化我的显示器:

float ratio = (float) width / height;
Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);  //Using Orthographic as developing 2d

我无法理解的是:

假设我的应用是一个“固定屏幕”游戏(就像吃豆人,即没有滚动,整个游戏都在屏幕上可见)。

现在,如果我在 x 和 y 上都在 -1 到 +1 处绘制一个四边形,我会得到这样的结果:

显然,这是因为我设置了 -ratio, ratio ,如上所示。所以这是正确的。

但我应该将它用作我的“整个”屏幕吗?左右两侧有相当大的信箱?

我想要一个矩形显示器,它是物理显示器的整个高度(以及尽可能多的宽度),但这意味着在小于 -1 且大于 +1 时绘制,这是一个问题吗?

我意识到如果这是一个滚动游戏,我可以选择使用剪辑,但对于这个特定的场景,我希望屏幕上的整个“游戏板”是静态的(并且尽可能多地使用可用的屏幕真实房地产尽可能不“拉伸”,从而导致我的精灵伸长)。

因为我喜欢使用 0,0 作为屏幕顶部,所以基本上我所做的就是将我的 draw 方法传递给这样的东西:

quad1.drawQuad (10,0);

当 drawQuad 方法得到这个时,它基本上采用从左到右的范围,如我的 openGL 所表达的那样,并除以屏幕宽度(所以,在我的情况下,-1.7 到 +1.7 所以 3.4/2560 = 0.001328125)。假设我指定 10 作为我的 X(如上),它会说:

-1.7 + (10*0.001328125) = -1.68671875

然后它在 -1.68671875 处绘制四边形。

这样做我可以使用正常的坐标(我只是减去而不是为 y 轴添加,所以我可以在顶部有 0)。

这是做事的好方法吗?

因为使用这种方法,此刻,如果我指定一个 100,100 的正方形,它不是正方形,它是矩形。但是,从好的方面来说,我可以通过将四边形按宽 x 高缩放来填充整个物理屏幕。

【问题讨论】:

    标签: android screen opengl-es-2.0 screen-resolution aspect-ratio


    【解决方案1】:

    您正在绘制一个 1x1 四边形,这就是您看到 1x1 四边形的原因。尝试将四边形 0.25 向右或向左平移,您会发​​现您也可以在该空间中绘图。

    在图形中,您创建一个对象,例如四边形,在您的情况下,您将其设为 1x1。然后你把它放在你想要的任何地方。如果你不定位它,那么它将在原点,这就是你所看到的。

    如果你绘制一个更宽的形状,你也会看到你可以在屏幕上的这个区域之外绘制。

    顺便说一下,使用正交矩阵函数,您不仅要指定屏幕纵横比,还要指定必须使用的坐标单位大小。这就是为什么 1x1 填充屏幕高度的原因,因为您的上下边界设置为 1 和 -1。你的比率略大于一,因为你的宽度比你的高度长,所以你的左右边界基本上是 -1.5 和 1.5(不管你的比率是多少)。

    但你也可以这样做;

    Matrix.orthoM(mProjMatrix, 0, -width/2, width/2, -height/2, height/2, 3, 7);

    在这里,您的比率是相同的,但您将其发送到具有屏幕坐标的正射投影。 (免责声明:我不使用与您相同的数学库,但这些似乎是基于您传递给它的参数的传统正交矩阵函数)。

    假设您的分辨率为 1000x500 像素。在 OpenGL 中,您的 0,0 原点位于中间。所以现在你的左边缘在(-500,y),右边缘在(500,y),你的顶部是(x,250)。因此,如果您绘制 1x1 四边形,它会非常小,但如果您绘制 250x250 正方形,它看起来就像您之前正射投影中的 1x1 四边形。

    因此您可以指定您想要的坐标、比率、单位大小等,以了解您想要的工作方式。就个人而言,我不喜欢将坐标指定为 0 到 1 之间的分数,我喜欢将它们与屏幕像素相同的意义来考虑。

    但无论您是否选择这样做,希望您了解您实际传递给这些矩阵函数的内容。

    最好的学习方法之一是在屏幕上绘制一个对象,然后玩弄你发送到模型视图和投影矩阵的不同数字,这样你就可以看到它们实际在做什么。

    【讨论】:

    • 感谢@SebbyJohanns,我在原始问题的末尾进行了编辑,请您发表评论吗?非常感谢您到目前为止的帮助!
    • 我建议,如果你画一个 100x100 的正方形,你就可以得到一个正方形,而不必经过任何中间函数。现在,在您学习的同时,按照设计的方式正确设置您的投影。当你开始真正感受到这些东西的工作原理时,你可以考虑为自己抽象一些东西,但我个人不会按照你在编辑中所说的方式去做。您应该熟悉 OpenGL 坐标系,其中 (0,0) 是屏幕的中心。
    • 如果您设备的操作系统报告的坐标与 OpenGL 不同(如 iOS 的情况),只需编写一个简单的函数,先将这些坐标转换为 OpenGL 坐标,但当您实际进行绘图等时,您应该传递 OpenGL 坐标,否则您将面临错误和令人困惑的代码。
    • 好的,但是说我想绘制整个屏幕背景 - 我该怎么做?如果我通过屏幕的宽度,如果你明白我的意思,我只会得到一个正方形,而不是整个背景?我如何指定我的宽度等于实际的物理宽度?
    • 取决于您使用的投影。在我的示例中,如果您绘制一个宽度为屏幕宽度且高度为屏幕高度的四边形,您将得到一个填充整个屏幕的四边形。使用您的投影,您的四边形的宽度将类似于 1.5 或任何您的比率,其高度将为 1。这也将填满整个屏幕。
    猜你喜欢
    • 2011-06-25
    • 2011-06-28
    • 2017-03-24
    • 2011-09-08
    • 2013-04-27
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多