【问题标题】:Farseer Physics objects don't quite touchFarseer Physics 对象并没有完全接触
【发布时间】:2013-01-11 20:28:05
【问题描述】:

我刚刚让 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 填充整个文件。

【问题讨论】:

  • 在调试绘图模式下看起来如何?你的物理身体是否与你的盒子/纹理完美对齐?
  • @FredGassmann - 无法让调试视图正常工作。它以分钟为单位渲染所有内容。
  • 在将 farseer 集成到我的一个 XNA 项目中时,我遇到了类似的问题。然后我尝试了调试视图,它也没有为我正确缩放。我研究了 farseer 示例应用程序,最终能够让调试视图正常工作。一旦我这样做了,将物理实体与精灵对齐就变得微不足道了。我目前无法访问该代码,但我会在今天晚些时候回来查看,如果您仍然遇到问题,我会看看是否可以提供更多信息。我建议专注于调试视图,因为如果它不能正常工作,你会遇到更多问题
  • @FredGassmann i.imgur.com/Yf2Qx.png - 我开始调试了。
  • 你能用一些 alpha 重新打开你的纹理,这样你就可以看穿并检查对齐了吗?像你的缩放这样的接缝有点偏离。

标签: c# winforms xna farseer


【解决方案1】:

Farseer 中的多边形周围有一层薄薄的“皮肤”。它们不会精确地相互接触 - 但会被这种皮肤抵消。这是设计使然。

更多详情,请参阅Settings.PolygonRadius。它基本上可以帮助改进碰撞检测。

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

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

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


不要忘记,Farseer 已针对大小和重量范围为 0.1 到 10 个单位的对象进行了调整。传统上,您会使用米和公斤来表示这些秤(尽管您不必这样做)。

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

【讨论】:

  • 在阅读了您的帖子后,我尝试了一些设置和值,并且能够修复它:) 我缩放纹理,使它们在两个轴上增加 1 个像素并将纹理转移到与模拟对齐。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多