1

在 FarseerPhysics 引擎/XNA 中,什么是ConvertUnits.ToDisplayUnits();

4

3 回答 3

6

Farseer(或者更确切地说,它源自 Box2D)经过调整,可以最好地处理重量范围为 0.1 到 10 个单位,尺寸(宽度或高度)为 0.1 到 10 个单位的对象。如果您使用超出此范围的对象,您的模拟可能不会像其他情况下那样稳定。

大多数情况下,这适用于您可能在游戏中找到的“常规”大小的对象(汽车、书籍等),以米和千克为单位。但是,这不是强制性的,实际上您可以选择任何比例。(例如:涉及弹珠或飞机的游戏可能使用米/公斤以外的比例)。

大多数游戏都有不同的空间。例如:“模型”空间、“投影”空间、“视图”空间、“世界”空间、“屏幕”空间、“客户端”空间。有些以像素为单位,有些以普通单位衡量。通常游戏使用矩阵将顶点从一个空间转换到另一个空间。最明显的是以单位衡量的世界,并将其显示在以像素为单位的屏幕上。

XNASpriteBatch默认情况下通过让世界空间与客户空间相同来简化这一点。一个世界单位 = 一个像素。

通常,您应该将您的世界空间定义为您的物理世界所在的空间相同。但这在使用SpriteBatch的默认空间时会出现问题 - 因为您不能有一个大于 10 像素的物理对象,而无需外出Farseer 调整的范围。

Farseer [1]的解决方案是拥有两个不同的世界空间——游戏空间和物理空间。ConvertUnits并在需要在这两个系统之间转换的任何地方使用该类。

我个人觉得这个解决方案非常糟糕,因为它非常容易出错(因为您必须在整个代码中的多个位置进行正确的转换)。

对于任何适度严肃的游戏开发工作,我建议使用统一的世界空间,根据 Farseer 的要求进行设计。然后要么使用全局变换到SpriteBatch.Begin,或者完全不同于SpriteBatch,来将该世界渲染到屏幕上。

但是,对于简单的演示,ConvertUnits可以完成这项工作。它可以让您保持SpriteBatch未缩放精灵纹理中的一个像素 = 屏幕上的一个像素的良好属性。


[1]:上次我检查时,ConvertUnits它是 Farseer 样本的一部分,而不是物理库本身的一部分。

于 2012-03-01T10:14:23.393 回答
1

Farseer 使用 MKS(米、千克、秒)计量单位。它们提供了将显示测量单位转换为 MKS 测量单位的方法,反之亦然。ToSimUnits() 和 ToDisplayUnits()。

于 2012-02-29T21:16:35.313 回答
1

我没有处理那段特定的代码,但是大多数具有虚拟空间(游戏世界)的游戏都会有一个类似于“ToDisplayUnits”的功能,它的功能是将游戏世界的物理单位转换为显示单位XNA。

一个例子是米到像素,或米到 x,y 屏幕坐标。

这样做很好,因为它允许您在物理单元中进行所有数学运算并保持所有抽象,然后将内容分别转换到游戏屏幕上。

于 2012-02-29T21:05:46.030 回答