物理单位转换

我正在做一个2D游戏的物理,其中视觉效果在openGl中表示。 重力是9,8米/秒^ 2,我如何将其转换为我的屏幕尺寸? OpenGl将宽度设置为-1到1,并确定屏幕真实宽度和高度的高宽比以获得高度的大小(从-3到3,由于是智能手机游戏)。

我知道我必须将电表转换成我的屏幕尺寸单位,但这些单位是什么,我怎么把电表转换成它们? 例如,可以说我想让我的屏幕代表20米,math是什么?

9,8 m / s ^ 2 * x screenUnits / m = y screenUnits / s ^ 2

那些屏幕单位是像素? OpenGl没有什么意义,从-1到1的大小单独表示像素的大小。 我希望这在各种智能手机上都一样。

提前致谢。

物理vs渲染

由于OpenGL使用浮点math,所以使用1个世界空间单位= 1米的尺度可能是一个很好的指导方针。 然后,一个单位的浮点部分是一米的几分之一。

(对于3D,您将相应地设置您的裁剪距离和z缓冲区深度。)

事实上,你的渲染比例是根据你的物理尺度而不是相反的。 忽略除自由浮动摄像机速度之外的任何物理因素,如果您喜欢,则可以使用1个世界空间单位= 100m,并相应地设置您的剪辑距离和z缓冲区:假设您的自由摄像机速度相应地设置,与上面提到的1:1的比例相同。

…所以它实际上是你的物理规模,决定了事物在你的世界中的真实感受。 不同的物理引擎(无论是自定义的还是预先打包的)在一定的容差范围内工作,你可以扩展你的渲染来匹配。 例如,默认情况下,Box2D(我猜你可能会使用,因为你的问题标签)在十分之一米到一百米的范围内运行良好,大概在面积方面; 群众运作不同的容忍度。 超出这些容忍范围将会使得物理学有些错误,越来越远离这个范围。

我建议用googlesearch“box2D物理规模”来看看这个更多的讨论; 即使你使用另一个物理引擎,我认为这会帮助你更好地理解这个概念。

像素与标准化设备坐标

完全忽略像素。 OpenGL在NDC中运行,这是你应该需要担心的。 您的变换math(隐式在固定管道中,在可编程stream水线中明确表示,即基于着色器的代码)处理其余部分。 你说你想让它在所有智能手机上都一样,使用NDC,它将根据每部手机的屏幕尺寸来简单地缩放。 如果OTOH希望大屏幕用户从更大的播放区域获益,那么您需要从操作系统中检索该手机的分辨率,并使用该分辨率进行相应的缩放,因为OpenGL没有像素分辨率的概念。