Box2D Diferencia entre WorldCenter y Posición

9

Entonces este problema ha estado fracasando por un par de días En primer lugar, ¿cuál es la diferencia entre decir Body.getWorldCenter () y Body.getPosition (). Escuché que WorldCenter podría tener que ver con el centro de gravedad o algo así.

En segundo lugar, cuando creo un cuerpo Box2D para un sprite, el cuerpo siempre está en la esquina inferior izquierda. Lo verifico imprimiendo un Rectángulo de 1 píxel alrededor de box.getWorldCenter (). Por lo que entiendo, el Cuerpo debería estar en el centro del Sprite y su caja delimitadora debería envolverse alrededor del Sprite, ¿correcto?

Aquí hay una imagen de lo que quiero decir (El Sprite es Rojo, Azul Cuerpo):

ingrese la descripción de la imagen aquí

Aquí hay un código:

Creador del cuerpo:

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

Haciendo el 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 );
}
Lancer gratis
fuente

Respuestas:

10

En primer lugar, ¿cuál es la diferencia entre decir Body.getWorldCenter () y Body.getPosition ().

Body.getWorldCenter()Es el centro de gravedad. Body.getPosition()es el centro de la AABB. Para una caja o círculo simple serán los mismos, sin embargo, si su cuerpo está desequilibrado (por ejemplo, múltiples dispositivos / w diferentes densidades), serán diferentes. También intente configurar su origen antes de la ubicación.

Entonces

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

en vez de

mSprite.setPosition( pX, pY );
mSprite.setOrigin( mSprite.getWidth()/2, mSprite.getHeight()/2);
Trueno clásico
fuente
1
Por lo tanto, es mejor establecer el origen que hacerlo en el bucle de representación: mSprite.setPosition (mBody.getPosition (). X * C.P2M - mSprite.getWidth () / 2, mBody.getPosition (). Y * ...) ?
Gratis Lancer
Además, esto es realmente extraño, pero parece que a velocidades realmente altas la textura parece estar por delante de los cuadros de límite de Sprite y Body.
Lancer gratuito
1
@FreeLancer Estaba pensando exactamente la misma pregunta sobre si sería mejor establecer el origen o compensar el dibujo.
Amplify91
1
No importa si compensa el dibujo usted mismo o si deja que Box2D lo compense usando el valor de origen. Los mismos cálculos suceden en alguna parte. Es más fácil razonar en su propio código, ya que la posición es el centro de algo :).
Roy T.
Ok, entonces intenté establecer el origen primero como dijiste, pero después de cambiar el método draw () de Car a: mSprite.setPosition (mBody.getPosition (). X * C.P2M, mB ...) Volvió a lo mismo problema
Lancer gratis