Box2D Differenza tra WorldCenter e posizione


9

Quindi questo problema è stato il fratello da un paio di giorni. Prima di tutto, qual è la differenza tra dire Body.getWorldCenter () e Body.getPosition (). Ho sentito che WorldCenter potrebbe avere a che fare con il centro di gravità o qualcosa del genere.

In secondo luogo, quando creo un Box2D Body per uno sprite, il Body è sempre nell'angolo in basso a sinistra. Lo controllo stampando un rettangolo di 1 pixel attorno al box.getWorldCenter (). Da quello che ho capito, il Corpo dovrebbe essere al centro dello Sprite e il suo riquadro di delimitazione dovrebbe avvolgere lo Sprite, giusto?

Ecco un'immagine di ciò che intendo (The Sprite is Red, Body Blue):

inserisci qui la descrizione dell'immagine

Ecco un po 'di codice:

Creatore del corpo:

    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;
}

Fare lo Sprite:

    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 );
}

Risposte:


10

Prima di tutto, qual è la differenza tra dire Body.getWorldCenter () e Body.getPosition ().

Body.getWorldCenter()è il centro di gravità. Body.getPosition()è il centro dell'AABB. Per una semplice scatola o cerchio saranno uguali tuttavia se il tuo corpo è sbilanciato (es. Apparecchi multipli / con densità diverse) differiranno. Prova anche a impostare l'origine prima della posizione.

Così

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

invece di

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

1
Quindi impostare l'origine è meglio che farlo nel loop di rendering: mSprite.setPosition (mBody.getPosition (). X * C.P2M - mSprite.getWidth () / 2, mBody.getPosition (). Y * ...) ?
Lancer gratuito il

Inoltre, questo è davvero strano, ma sembra che a velocità davvero elevate la Texture sembri essere in vantaggio sia sui box di limitazione Sprite che su quelli Body.
Lancer gratuito il

1
@FreeLancer Stavo pensando la stessa esatta domanda se sarebbe meglio impostare l'origine o compensare il disegno.
Amplifica91 il

1
Non importa se compensi tu stesso il disegno o se permetti a Box2D di compensarlo usando il valore di origine. Gli stessi calcoli avvengono da qualche parte. È più semplice ragionare nel tuo codice poiché la posizione è al centro di qualcosa :).
Roy T.

Ok, quindi ho provato a impostare l'origine prima come hai detto, ma dopo aver modificato il metodo draw () dell'auto in: mSprite.setPosition (mBody.getPosition (). X * C.P2M, mB ...) È tornato allo stesso problema
Lancer gratuito
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.