Box2D Unterschied zwischen WorldCenter und Position


9

Dieses Problem besteht also seit einigen Tagen. Was ist der Unterschied zwischen Body.getWorldCenter () und Body.getPosition ()? Ich habe gehört, dass WorldCenter möglicherweise mit dem Schwerpunkt oder so etwas zu tun hat.

Zweitens, wenn ich einen Box2D-Body für ein Sprite erstelle, befindet sich der Body immer in der unteren linken Ecke. Ich überprüfe es, indem ich ein Rechteck von 1 Pixel um die box.getWorldCenter () drucke. Soweit ich weiß, sollte sich der Körper in der Mitte des Sprites befinden und sein Begrenzungsrahmen sollte sich um das Sprite wickeln, richtig?

Hier ist ein Bild von dem, was ich meine (The Sprite ist Rot, Body Blue):

Geben Sie hier die Bildbeschreibung ein

Hier ist ein Code:

Body Creator:

    public static Body createBoxBody( final World pPhysicsWorld, final BodyType pBodyType, 
            final FixtureDef pFixtureDef, Sprite pSprite ) {

        float pRotation = 0;
        float pCenterX = pSprite.getX() + pSprite.getWidth() / 2;
        float pCenterY = pSprite.getY() + pSprite.getHeight() / 2;
        float pWidth = pSprite.getWidth();
        float pHeight = pSprite.getHeight();

        final BodyDef boxBodyDef = new BodyDef();
        boxBodyDef.type = pBodyType;

        //boxBodyDef.position.x = pCenterX / Constants.PIXEL_METER_RATIO;
        //boxBodyDef.position.y = pCenterY / Constants.PIXEL_METER_RATIO;

        boxBodyDef.position.x = pSprite.getX() / Constants.PIXEL_METER_RATIO;
        boxBodyDef.position.y = pSprite.getY() / Constants.PIXEL_METER_RATIO;

        Vector2 v = new Vector2( boxBodyDef.position.x * Constants.PIXEL_METER_RATIO, boxBodyDef.position.y * Constants.PIXEL_METER_RATIO );
        Gdx.app.log("@Physics", "createBoxBody():: Box Position: " + v);

        // Temporary Box shape of the Body
        final PolygonShape boxPoly = new PolygonShape();
        final float halfWidth = pWidth * 0.5f / Constants.PIXEL_METER_RATIO;
        final float halfHeight = pHeight * 0.5f / Constants.PIXEL_METER_RATIO;
        boxPoly.setAsBox( halfWidth, halfHeight );  // set the anchor point to be the center of the sprite

        pFixtureDef.shape = boxPoly;


        final Body boxBody = pPhysicsWorld.createBody(boxBodyDef);
        Gdx.app.log("@Physics", "createBoxBody():: Box Center: " + boxBody.getPosition().mul(Constants.PIXEL_METER_RATIO));
        boxBody.createFixture(pFixtureDef);

        boxBody.setTransform( boxBody.getWorldCenter(), MathUtils.degreesToRadians * pRotation );


        boxPoly.dispose();

        return boxBody;
}

Das Sprite machen:

    public Car( Texture texture, float pX, float pY, World world ) {

        super( "Car" ); 

        mSprite = new Sprite( texture );
        mSprite.setSize( mSprite.getWidth() / 6, mSprite.getHeight() / 6 );
        mSprite.setPosition( pX, pY );
        mSprite.setOrigin( mSprite.getWidth()/2, mSprite.getHeight()/2);

        FixtureDef carFixtureDef = new FixtureDef();

        // Set the Fixture's properties, like friction, using the car's shape
        carFixtureDef.restitution = 1f;
        carFixtureDef.friction = 1f;
        carFixtureDef.density = 1f; // needed to rotate body using applyTorque      

        mBody = Physics.createBoxBody( world, BodyDef.BodyType.DynamicBody, carFixtureDef, mSprite );
}

Antworten:


10

Was ist der Unterschied zwischen Body.getWorldCenter () und Body.getPosition ()?

Body.getWorldCenter()ist der Schwerpunkt. Body.getPosition()ist das Zentrum des AABB. Für eine einfache Box oder einen einfachen Kreis sind sie gleich, aber wenn Ihr Körper unausgeglichen ist (z. B. mehrere Vorrichtungen / mit unterschiedlicher Dichte), unterscheiden sie sich. Versuchen Sie auch, Ihren Ursprung vor dem Ort festzulegen.

Damit

mSprite.setOrigin( mSprite.getWidth()/2, mSprite.getHeight()/2);
mSprite.setPosition( pX, pY );

anstatt

mSprite.setPosition( pX, pY );
mSprite.setOrigin( mSprite.getWidth()/2, mSprite.getHeight()/2);

1
Setzen Sie den Ursprung also besser als in der Render-Schleife: mSprite.setPosition (mBody.getPosition (). X * C.P2M - mSprite.getWidth () / 2, mBody.getPosition (). Y * ...) ?
Free Lancer

Auch das ist wirklich seltsam, aber es scheint, dass bei wirklich hohen Geschwindigkeiten die Textur sowohl den Sprite- als auch den Body-Begrenzungsrahmen voraus zu sein scheint.
Free Lancer

1
@FreeLancer Ich dachte genau die gleiche Frage darüber, ob es besser wäre, den Ursprung festzulegen oder die Zeichnung zu versetzen.
Amplify91

1
Es spielt keine Rolle, ob Sie die Zeichnung selbst versetzen oder Box2D sie mithilfe des Ursprungswerts versetzen lässt. Die gleichen Berechnungen finden irgendwo statt. Es ist einfach einfacher, in Ihrem eigenen Code zu argumentieren, da die Position das Zentrum von etwas ist :).
Roy T.

Ok, also habe ich versucht, den Ursprung zuerst festzulegen, wie Sie gesagt haben, aber nachdem ich die draw () -Methode des Autos in: mSprite.setPosition (mBody.getPosition (). X * C.P2M, mB ...) geändert habe, ging es zurück zum selben Problem
Free Lancer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.