Farseer Meter / Pixel Ratio

我用c ++中的box2d做了很多,并尝试了C#。 看起来Farseer通常用来取代Box2D(我知道Box2DXNA,但它看起来有点过时了。)所以,Farseer就是我一直在使用的。 当我使用C ++和Box2D时,每个人总是建议不要使用1像素/米的比例(出于什么原因,我不知道),并且通常建议使用大约30像素/米的某个地方。 正如我一直在研究Farseer,我看到了许多相互矛盾的陈述。 有人说使用1pixel /米,其他人说使用比例,其他人说要使用ConvertUnits.ToSimUnits和ConvertUnits.ToDisplayUnits等。

那我该怎么用? 现在,我正在使用ConvertUnits,但一切都在奇怪的地方呈现。 是否有事实上的标准或我应该去的任何事情? 提前致谢。

Farseer 3.x基于Box2D。 Box2D 常见问题解答说 :

Box2D调整为米 – 千克 – 秒(MKS)。 您的移动物体应在0.1到10米之间。 不要使用像素作为单位! 你会得到一个紧张的模拟。

换句话说,假设一个“正常”的物理世界,你应该有1个物理单位= 1m 。 但是任何导致大多数移动物体在0.1到10单位范围内的比例都应该没问题。

所以,假设你正在制作汽车模型。 一个非常非常简单的模型恰好是一个矩形。 您可以使用以下内容创建它:

float width = 4.1f; // average car length in meters float height = 1.4f; // average car height in meters // Note: this method takes half-sizes: var carVertices = PolygonTools.CreateRectangle(width / 2f, height / 2f); // Then pass carVertices into PolygonShape, etc... 

另一个问题是如何以正确的大小渲染您的世界。

通常这样做的方式是使用相机或视图矩阵(在标准世界/视图/投影系统中)的渲染时间。 你可以做的两个地方是BasicEffect.View ( MSDN ),或SpriteBatch.Begin的转换矩阵参数( MSDN , 另见 )。

IMO,Farseer ConvertUnits类是处理转换的一种非常难看的方式。

我使用int MetersPixel = 64; 对于我所有的基础计算。 所以我很少有人认为它们的纹理是16px宽。 所以当用Farseer创建他们的身体时,宽度是0.25。

16/64 = 0.25

最重要的是,感觉,尺寸/比例和重量适合我当前的比赛,我不相信有任何黄金法则或理由为什么你应该跳过篮球只是为了让你的代码10 = 1等。

到目前为止它对我来说非常合适。 我从没想过尝试将10px转换为1m,但是对于我目前的游戏构建,我不会认为它有用。