0

我在 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 高度缩放四边形来填充整个物理屏幕。

4

1 回答 1

0

您正在绘制一个 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 之间的分数,我喜欢将它们与屏幕像素的含义相同。

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

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

于 2013-04-07T13:56:48.180 回答