【问题标题】:How do I preserve physical sizes between different iThings in Open GL?如何在 Opengl 中保留不同事物之间的物理尺寸?
【发布时间】:2012-03-26 23:32:30
【问题描述】:

我最近一天醒来,意识到我们 iOS 开发人员现在有一小群不同的屏幕尺寸/分辨率可以适应。下表说明了当前部署的 iOS 设备的屏幕规格:

http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density

非常方便。现在这是难题:

我在 iPad2 上构建了一个简单的 Open GL 视图。我的代码正在制作 OpenGL 视口 iPhone/Pad 的普通像素尺寸(320x480、768x1024)。我在这个东西上画了一个白色的矩形。我把它设为 200px 宽。这真好。好旧的 iPad。

我将相同的代码(自动检测屏幕尺寸)编译到我的 iPhone4 中。我的白色矩形与垫子上的宽度不同。很公平。我知道iPhone4的实际像素尺寸是640x960,iPad是768x1024,考虑到每个设备的ppi。

除以 768/640 我得到了很好的缩放因子 1.2,然后我将其乘以 200 得到我的测试矩形的宽度并为 iPhone4 重新编译... Arrrgh...它几乎可以工作了.该矩形仅比 iPad 对应的矩形小几个像素。

谁能指出我推理中的错误?我希望能够将可显示对象标记为“与屏幕无关”,以在 iThings 之间保留它的 物理 尺寸。一次编写,随处运行。对对对。

我正在开发一款游戏,当然,那该死的精彩 iPad3 有了新的分辨率。我试图尽可能多地抽象出可能的解决陷阱。在发布之前,我可能没有机会在 iPad3 上测试我的应用程序。还有其他人在同一条船上吗?

【问题讨论】:

  • 我不会根据大屏幕尺寸除以小屏幕尺寸的因素来缩放它。我会用划分PPI的因素来做。但是,我不会担心物理尺寸,只要比例好就足够了(除非您需要物理尺寸在设备之间保持不变,例如在标尺应用上)

标签: iphone ipad opengl-es screen-resolution retina-display


【解决方案1】:

我发现了我的问题。我在上一篇文章中解释的解决方案完全似是而非。

OpenGL 在绘制我的测试矩形时,并不关心像素分辨率。它只关心你提供给它的坐标系。毫无疑问,像你们中的许多人一样,我使用方便的 320x480 / 768x1024 尺寸作为 OpenGL for Phone/Pad 中的坐标系。

我缺少的是 iPhone[320/480] 系统中的 200 个“OpenGL-land”单元与 iPad[768/1024] 系统中的 200 个单元不同不是因为屏幕分辨率差异,但因为 320/760(或等效为 480/1024)的比率与 Phone/Pad 的屏幕宽度或屏幕高度的比率不同。我拿出尺子自己量了一下尺寸,因为我在网上找不到权威、可信的数字。

iPhone 屏幕宽度:5.05 厘米 iPad 屏幕宽度:14.8 厘米

您可以很容易地看到 5.05/14.8 与 320/768 不同。

无论如何,iPhone 上 cm 与 OpenGL 单位的“真实”比率为 5.05/320,而 iPad 等效值为 14.8/768。

两者之间的比例因子是x:

14.8/768 = x(5.05/320)

0.01927083333333 = x*0.01578125

= 1.221(最接近千分之一)

所以我回到我的 iPhone 代码,现在我将测试矩形的大小调整为 1.221*200 宽,并在我的 iPad 代码中将测试矩形设置为 200。重新编译两者。 这一次,我的白色测试矩形在 iPad2 和 iPhone4 上的宽度完全相同。

OpenGL 不关注像素密度。它正在关注它的坐标系。这就是为什么这种技术有效的原因。准确地保留物理尺寸可能有点疯狂,但如果我需要有解决方案,我可以睡得更轻松。

千年隼, 亚历克斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多