Box2D Différence entre WorldCenter et Position


9

Donc, ce problème sévit depuis quelques jours maintenant. Tout d'abord, quelle est la différence entre dire Body.getWorldCenter () et Body.getPosition (). J'ai entendu dire que WorldCenter pourrait avoir à voir avec le centre de gravité ou quelque chose.

Deuxièmement, lorsque je crée un corps Box2D pour un sprite, le corps est toujours dans le coin inférieur gauche. Je le vérifie en imprimant un rectangle de 1 pixel autour du box.getWorldCenter (). D'après ce que je comprends, le corps devrait être au centre du sprite et sa boîte englobante devrait s'enrouler autour du sprite, n'est-ce pas?

Voici une image de ce que je veux dire (The Sprite is Red, Body Blue):

entrez la description de l'image ici

Voici du code:

Créateur de corps:

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

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

Réponses:


10

Tout d'abord, quelle est la différence entre dire Body.getWorldCenter () et Body.getPosition ().

Body.getWorldCenter()est le centre de gravité. Body.getPosition()est le centre de l'AABB. Pour une simple boîte ou un cercle, ils seront les mêmes, mais si votre corps est déséquilibré (par exemple, plusieurs appareils / différentes densités), ils différeront. Essayez également de définir votre origine avant l'emplacement.

Donc

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

au lieu de

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

1
Il est donc préférable de définir l'origine que de le faire dans la boucle de rendu: mSprite.setPosition (mBody.getPosition (). X * C.P2M - mSprite.getWidth () / 2, mBody.getPosition (). Y * ...) ?
Lancer gratuit

En outre, c'est vraiment bizarre, mais il semble qu'à des vitesses très élevées, la texture semble être en avance sur les boîtes englobantes Sprite et Body.
Lancer gratuit

1
@FreeLancer Je pensais à la même question exacte pour savoir s'il serait préférable de définir l'origine ou de décaler le dessin.
Amplify91

1
Peu importe si vous décalez le dessin vous-même ou si vous laissez Box2D le compenser en utilisant la valeur d'origine. Les mêmes calculs se produisent quelque part. C'est juste plus facile de raisonner dans votre propre code car la position étant le centre de quelque chose :).
Roy T.

Ok, j'ai donc essayé de définir l'origine comme vous l'avez dit, mais après avoir changé la méthode draw () de la voiture en: mSprite.setPosition (mBody.getPosition (). X * C.P2M, mB ...) Cela est revenu à la même chose problème
Free Lancer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.