0

我已经在 c++ 中使用 box2d 做了很多工作,并且正在尝试使用 C#。看起来 Farseer 通常用于代替 Box2D(我知道 Box2DXNA,但它似乎有点过时了。)所以,Farseer 是我一直在使用的。当我使用 C++ 和 Box2D 时,每个人都建议不要使用 1 像素/米的比例(出于什么原因,我不知道),通常建议使用 30 像素/米左右的比例。当我一直在研究 Farseer 时,我看到了很多相互矛盾的说法。有人说使用 1pixel/meter,有人说使用比例尺,有人说使用 ConvertUnits.ToSimUnits 和 ConvertUnits.ToDisplayUnits 等。

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

4

2 回答 2

2

Farseer 3.x 基于 Box2D。Box2D FAQ 说

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,FarseerConvertUnits类是处理转换的一种非常丑陋的方式。

于 2011-10-12T07:31:07.187 回答
1

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

16 / 64 = 0.25

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

到目前为止,它对我来说非常完美。我从没想过尝试将 10px 转换为 1m,但在我目前的游戏版本中,我认为这没有用。

于 2011-10-14T09:27:01.447 回答