使用glOrthof的OpenglES多平台屏幕比例解决方案

时间:2012-03-15 21:30:11

标签: android ios opengl-es 3d

我正在为iOS,Android和BADA编写一个小型跨平台游戏引擎。无论屏幕分辨率和比例如何,我都有一个关于将视角设置为一致的问题。

我为翻​​转的标准化正投影进行了以下设置,效果很好:

 glViewport(0, 0, mWidth, mHeight);

 glMatrixMode(GL_PROJECTION);

glOrthof(-1.0,                  //LEFT
          1.0,                   //RIGHT
          -1.0 * mHeight / mWidth,  //BOTTOM
          1.0 * mHeight / mWidth,   //TOP
          -2.0,                  //NEAR
          100.0);                //FAR

在我的iPhone上,这很好,我得到了世界物体的理想位置,但在一些Android设备和iPad上保留正确比例的位置。

所有网格都是正确的比例,但位置显然会改变,以便如果某些东西与屏幕底部对齐,则在iPad上渲染时,对象将部分地从屏幕上拉出。

所以问题是:

这是否正确,我需要相对于视口的宽度和高度放置对象?

或者

是否有一种设置正交透视的方法,这样无论屏幕比例如何,定位都会保持不变,而不会损坏世界物体的视角?

我正在思考我所知道的和我做的数学,第二个不是一个选项,因为透视是基于比率定义的。

1 个答案:

答案 0 :(得分:2)

iPad和iPhone屏幕的比例不同。 iPhone为3:2,iPad为4:3。 Android手机的列表范围太广了,我不想对Bada发表评论。因此,除非您要在信箱或邮箱中显示图像,或者将其拉伸以使宽高比在不同设备之间发生变化,否则可见内部世界的数量将在设备之间发生变化。

在您根据屏幕比例计算顶部和底部的同时修复左右参数的那一刻。因此,您可以在每台设备上获得与屏幕完全相同的数量,但垂直数量会发生变化。

如果你的游戏涉及一个移动到3d的相机,那么你真的没什么可以做的。但是既然你在谈论与屏幕两侧对齐的东西,我猜相机会在2d移动吗?

作为一般规则,如果相机沿垂直方向移动,那么您可能希望保留所拥有的内容。您的关卡布局正好是屏幕的宽度,将是每个人屏幕的宽度。更广泛的设备将能够进一步向前或向后看,但是你去了。

如果相机沿水平方向移动,则您可能希望切换为提供顶部和底部的固定值,并根据宽高比计算左右。所以我想那就是:

glOrthof(-1.0 * mWidth / mHeight, //LEFT
          1.0 * mWidth / mHeight, //RIGHT
          -1.0 ,                  //BOTTOM
          1.0 ,                   //TOP
          -2.0,                   //NEAR
          100.0);                 //FAR

就能够在库中关闭所有内容而言,您可能只需要接收一个标志,以确定逻辑视口宽度是否应该固定,高度是否适合屏幕或高度固定和宽度适应。 / p>