我刚刚完成了Farseer Physics的工作,并且创建了一个快速/粗略的基础对象,可用来轻松创建对象。

因此,我建立了一个快速仿真,它看起来像这样:

在DebugView中,它看起来像这样:

经过仔细检查,同时启用了两种模式,我可以看到橙色框缺少一行和一列像素:

有人知道为什么会这样吗?

class BasePhys
{
    public float unitToPixel;
    public float pixelToUnit;
    public Vector2 size;
    public Body body;
    public Texture2D texture;

    public BasePhys(World world, int x, int y)
    {
        this.unitToPixel = 100.0f;
        this.pixelToUnit = 1 / unitToPixel;
        TextureManager.GetTextureByName("base", ref this.texture);
        this.size = new Vector2(this.texture.Width, this.texture.Height);
        this.body = BodyFactory.CreateRectangle(world, this.size.X * this.pixelToUnit, this.size.Y * this.pixelToUnit, 1);
        this.body.BodyType = BodyType.Dynamic;
        this.body.Position = new Vector2(x * this.pixelToUnit, y * this.pixelToUnit);
    }
    public void Draw(SpriteBatch spriteBatch)
    {
        Vector2 scale = new Vector2(this.size.X / (float)this.texture.Width, this.size.Y / (float)this.texture.Height);
        Vector2 position = this.body.Position * unitToPixel;
        spriteBatch.Draw(this.texture, position, null, Color.White, this.body.Rotation, new Vector2(this.texture.Width / 2.0f, this.texture.Height / 2.0f), scale, SpriteEffects.None, 0);
    }
}


有谁知道为什么会这样吗?并非在所有Farseer演示中都这样做。我检查了纹理,它没有不可见的pixels,橙色的pixels填充了整个文件。

最佳答案

Farseer中的多边形周围有薄的“皮肤”。他们不会彼此完全接触-但会被这种皮肤抵消。这是设计使然。

有关更多详细信息,请参见Settings.PolygonRadius。从根本上来说,这是为了帮助改善碰撞检测。

默认情况下,多边形半径为0.01物理单位。您会注意到,在1 unit = 100 pixels的比例下,多边形半径恰好等于一个像素-因此,对象之间的距离为一个像素。

最简单的解决方法可能是使矩形尺寸在每个方向上减小多边形半径的两倍。或者,您可以将纹理缩放到稍大一些以说明半径。

(不要关闭半径本身,否则会出现物理故障。)



不要忘记,Farseer已调整为处理大小和重量范围从0.1到10个单位的对象。传统上,您会使用米和千克来表示这些刻度(尽管不必这样做)。

我个人觉得像素到单位的转换有点丑陋,因为您最终会在整个项目中分散易出错的缩放代码。对于实质性的事情,我建议对物理空间中的所有内容进行编码,然后使用摄影机矩阵(您可以将其传递给SpriteBatch.Begin)在渲染时缩放所有内容。

关于c# - Farseer Physics对象不太接触,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14286125/

10-10 13:15