Farseer ConvertUnits?

Noo*_*oon 1 c# xna farseer

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

And*_*ell 6

Farseer(或者更确切地说,Box2D,它来自)被调整为最适合重量为0.1到10个单位,0.1到10个单位(宽度或高度)的对象.如果使用此范围之外的对象,则模拟可能不会像其他情况那样稳定.

大多数情况下,这适用于游戏中可能存在的"常规"大小的物体(汽车,书籍等),以米和千克为单位.但是,这不是强制性的,事实上,您可以选择任何比例.(例如:涉及大理石或飞机的游戏可能使用米/公斤以外的比例).

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

SpriteBatch默认情况下,XNA 通过使世界空间与客户端空间相同来简化这一点.一个世界单位=一个像素.

通常你应该将你的世界空间定义为你的物理世界所存在的空间相同.但是当使用SpriteBatch默认空间时这将是一个问题- 因为你可能没有一个大于10像素的物理对象,而不是去外面Farseer调整的范围.

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

我个人认为这个解决方案非常糟糕,因为它非常容易出错(因为你必须在遍布代码的多个地方获得正确的转换).

对于任何适度严肃的游戏开发工作,我建议使用围绕Farseer所需的统一世界空间.然后使用全局变换SpriteBatch.Begin或其他完全变换SpriteBatch来渲染该世界.

但是,对于简单的演示,ConvertUnits是否有工作.它可以让你保持良好的SpriteBatch属性,即未缩放的精灵纹理中的一个像素=屏幕上的一个像素.


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