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

标签 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 上渲染时,对象将被部分绘制出屏幕。

所以问题:

这是正确的吗?我需要根据视口(viewport)的宽度和高度放置对象吗?

或者

有没有一种方法可以设置正交透视,无论屏幕比例如何,定位都将保持不变,而不会破坏世界对象的透视?

我是根据我所知道的进行思考,而我在第二次计算时所做的数学计算不可行,因为透视是根据比率定义的。

最佳答案

iPad 和 iPhone 的屏幕比例不同。 iPhone 是 3:2,iPad 是 4:3。 Android 手机的比例范围太广,无法一一列举,我真的不想对 Bada 发表评论。因此,除非您要在信箱或邮筒中显示您的图像,或者将其拉伸(stretch)以使纵横比因设备而异,否则您可见的内部世界的数量会因设备而异。

此时,您已经固定了左右参数,同时根据屏幕比例计算了顶部和底部。因此,您将在每台设备的屏幕上获得完全相同的世界范围,但垂直方向的范围会发生变化。

如果您的游戏涉及在 3d 中移动的摄像机,那么您真的无能为力。但是既然你说的是与屏幕两侧对齐的东西,我猜相机是二维移动的?

作为一般规则,如果相机沿垂直方向移动,那么您可能希望保留现有的东西。您的关卡布局正好是屏幕的宽度,将是每个人屏幕的宽度。更宽的设备将能够看到更远的前方或后方,但就是这样。

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

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

就能够在库中关闭这一切而言,您可能只需要接收一个标志,说明是否应固定逻辑视口(viewport)宽度并根据屏幕调整高度,或者固定高度并调整宽度。

关于android - 使用glOrthof的OpenglES多平台屏幕比例解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9728482/

相关文章:

java - 在按钮上显示 float

java - 如何在当前位置的 EditText 中添加可点击的小部件

android - 将 SQlite 与 MySql 同步

java - 如何将字符串数组的内容与字符串进行比较

ios - 将 iPhone 设置为通过扬声器开始播放,但允许耳机覆盖

ios - 点击手势以使用 TableView 关闭 UITextField

Android GLSurfaceView glTexImage2D glDrawTexiOES

android - Android 上的 OpenGL Artifact 渐变

ios - 使用 MKOverlayRenderer 绘制文本

iphone - 为什么 AVCaptureVideoDataOutput 回调依赖于 OpenGL 绘制帧速率?