我在c ++中用box2d做了很多,并尝试了C#。看起来Farseer通常用来代替Box2D(我知道Box2DXNA,但它看起来有点过时了。)所以,Farseer就是我一直在使用的。当我使用C ++和Box2D时,每个人都建议不要使用1像素/米的比例(出于什么原因,我不知道),并且通常建议使用大约30像素/米的某个地方。当我一直在研究Farseer时,我看到了许多相互矛盾的陈述。有人说使用1pixel /米,其他人说使用比例,其他人说使用ConvertUnits.ToSimUnits和ConvertUnits.ToDisplayUnits等。
那我该怎么用?现在,我正在使用ConvertUnits,但一切都在奇怪的地方呈现。是否有事实上的标准或我应该去的任何事情?提前谢谢。
答案 0 :(得分:2)
Farseer 3.x基于Box2D。而Box2D FAQ says:
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,see also)。
IMO,Farseer ConvertUnits
类是处理转换的一种非常难看的方式。
答案 1 :(得分:1)
我使用int MetersPixel = 64;对于我所有的基础计算。所以我有一点爱好,他们的纹理是16px宽。所以当用Farseer创建他们的身体时,宽度是0.25。
16/64 = 0.25
最重要的是,感觉,尺寸/比例和重量适合我当前的比赛,我不相信有任何黄金法则或理由为什么你应该跳过篮球只是为了使你的代码10 = 1等。
到目前为止,它对我来说非常合适。我从没想过尝试将10px转换为1m,但是对于我目前的游戏构建,我不会认为它有用。