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

最佳答案

Farseer(或更确切地说,它来自Box2D)已调整为与重量在0.1到10个单位,尺寸(宽度或高度)在0.1到10个单位范围内的对象一起使用时效果最佳。如果使用超出此范围的对象,则模拟可能不会像其他情况那样稳定。

在大多数情况下,这对于您在游戏中可能会发现的“常规”大小的物体(汽车,书籍等)非常有效,以米和千克为单位。但是,这不是强制性的,实际上,您可以选择任何比例。 (例如:涉及大理石或飞机的游戏可能会使用米/千克以外的比例尺)。

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

XNA的SpriteBatch默认情况下通过将世界空间与客户端空间相同来简化这一过程。一个世界单位=一个像素。

通常,您应该将世界空间定义为与物理世界所在的空间相同。但这在使用SpriteBatch的默认空间时会出现问题-因为您可能无法拥有大于10像素的物理对象,不会超出Farseer想要的范围。

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

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

对于任何认真认真的游戏开发工作,我建议使用围绕Farseer需求设计的统一世界空间。然后,要么使用对SpriteBatch.Begin的全局变换,要么使用完全不同于SpriteBatch的东西将其渲染到屏幕上。

但是,对于简单的演示,ConvertUnits可以完成。而且,它还可以保留SpriteBatch属性,即未缩放的精灵的纹理中的一个像素=屏幕上的一个像素。



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

关于c# - Farseer ConvertUnits?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9506458/

10-13 06:01