3

Farseer Physicsが機能するようになり、オブジェクトを簡単に作成するために使用できるクイック/クルードベースオブジェクトを作成しました。

簡単なシミュレーションを設定しました。次のようになります。ボックスが衝突しないFarseerの例

DebugViewでは、次のようになります。デバッグモードのボックスのFarseerの例

両方のモードを有効にして詳しく調べると、オレンジ色のボックスに1つの行と列のピクセルが欠落していることがわかります。テクスチャにピクセルがありません

なぜそうなるのか誰もが知っていますか?

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の塗りつぶしが表示されていません。

4

1 に答える 1

1

Farseerのポリゴンは、周囲に薄い「スキン」があります。それらは互いに正確には接触しませんが、このスキンによって相殺されます。これは仕様によるものです。

詳細については、を参照してくださいSettings.PolygonRadius。基本的には、衝突検出を改善するためにあります。

デフォルトでは、ポリゴンの半径は0.01物理単位です。のスケールで1 unit = 100 pixelsは、ポリゴンの半径は正確に1ピクセルに等しいため、オブジェクト間のギャップは1ピクセルになります。

おそらくこれに対する最も簡単な修正は、長方形のサイズを各方向のポリゴン半径の2倍小さくすることです。または、半径を考慮してテクスチャを少し大きく拡大縮小することもできます。

(半径自体をオフにしないでください。物理的な不具合が発生します。)


Farseerは、0.1から10ユニットの範囲のサイズと重量のオブジェクトを処理するように調整されていることを忘れないでください。従来、これらのスケールにはメートルとキログラムを使用していました(ただし、使用する必要はありません)。

個人的には、ピクセルから単位への変換は少し醜いです。プロジェクト全体にエラーが発生しやすいスケーリングコードが散在しているためです。実質的な何かについては、物理空間ですべてをコーディングしてから、カメラマトリックス(に渡すことができますSpriteBatch.Begin)を使用して、レンダリング時にすべてをスケーリングすることをお勧めします。

于 2013-01-12T12:28:38.987 に答える