Farseer Physics对象没有完全接触

3
我刚刚成功使用了,并创建了一个快速 / 粗略的基础对象,可以轻松创建物体。
因此,我设置了一个快速模拟,它看起来像这样: Farseer example of boxes not colliding 在DebugView中,它看起来像这样: Farseer example of boxes in debug mode 经过仔细检查,启用两种模式后,我发现橙色框缺少一行和一列像素: Missing pixel on texture 有人知道可能是什么原因吗?
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演示都会出现这种情况。我已经检查了纹理,它没有任何不可见的像素,橙色像素填充整个文件。


@FredGassmann - 遇到了调试视图无法正常工作的问题。它将所有内容都渲染成了微小的比例。 - MatthewMcGovern
@FredGassmann 我成功调试了。http://i.imgur.com/Yf2Qx.png - MatthewMcGovern
你能否将纹理打开并添加一些透明度,以便您可以查看并检查对齐吗?似乎你的缩放略有偏差。 - Fred Gassmann
让我们在聊天中继续这个讨论 - Fred Gassmann
我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
显示剩余3条评论
1个回答

1

Farseer中的多边形周围有一个薄的“皮肤”。它们不会完全接触,而是被这个皮肤偏移。这是设计上的考虑。

更多细节请参见Settings.PolygonRadius。基本上它是为了帮助改善碰撞检测。

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

可能最简单的解决方法是将矩形大小在每个方向上缩小两倍的多边形半径。或者,您可以稍微放大纹理以适应半径。

(不要关闭半径本身-您会遇到物理故障。)


不要忘记,Farseer被调整为处理大小和重量在0.1到10单位之间的对象。传统上,您会使用米和千克来表示这些比例(尽管您不必这样做)。

个人认为像素到单位的转换有点丑陋,因为您最终会在项目中散布易错的缩放代码。对于一些实质性的东西,我建议在物理空间中编写所有内容,然后在渲染时使用相机矩阵(您可以将其传递给SpriteBatch.Begin)来缩放所有内容。


1
我在阅读了您的帖子后尝试了一些设置和数值,并成功解决了问题 :) 我对纹理进行了缩放,使它们在两个轴上增加1像素,并将纹理移动以与模拟对齐。 - MatthewMcGovern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接