Box2D разница между WorldCenter и позицией

9

Так что эта проблема была братской уже пару дней. Прежде всего, в чем разница, скажем, между Body.getWorldCenter () и Body.getPosition (). Я слышал, что WorldCenter может быть связан с центром тяжести или чем-то еще.

Во-вторых, когда я создаю Box2D Body для спрайта, Body всегда находится в левом нижнем углу. Я проверяю это, печатая прямоугольник в 1 пиксель вокруг box.getWorldCenter (). Из того, что я понимаю, Тело должно быть в центре Спрайта, и его ограничительная рамка должна обернуться вокруг Спрайта, верно?

Вот изображение того, что я имею в виду (Спрайт красный, синее тело):

введите описание изображения здесь

Вот некоторый код:

Создатель тела:

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

Создание Спрайта:

    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 );
}
Свободный Лансер
источник

Ответы:

10

Прежде всего, в чем разница, скажем, между Body.getWorldCenter () и Body.getPosition ().

Body.getWorldCenter()это центр тяжести. Body.getPosition()является центром AABB. Для простой коробки или круга они будут одинаковыми, однако, если ваше тело не сбалансировано (например, несколько приборов / с различной плотностью), они будут различаться. Также попробуйте установить свое происхождение перед местоположением.

Так

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

вместо

mSprite.setPosition( pX, pY );
mSprite.setOrigin( mSprite.getWidth()/2, mSprite.getHeight()/2);
ClassicThunder
источник
1
Поэтому лучше установить источник, чем делать это в цикле рендеринга: mSprite.setPosition (mBody.getPosition (). X * C.P2M - mSprite.getWidth () / 2, mBody.getPosition (). Y * ...) ?
Свободный лансер
Кроме того, это действительно странно, но кажется, что на очень высоких скоростях текстура, кажется, опережает ограничивающие рамки спрайта и тела.
Свободный Лансер
1
@ FreeLancer Я думал о том же самом вопросе о том, будет ли лучше установить источник или сместить чертеж.
Amplify91
1
Не имеет значения, смещаете ли вы чертеж самостоятельно или позволяете Box2D смещать его, используя исходное значение. Такие же расчеты случаются где-то. Просто проще рассуждать в своем собственном коде как положение, являющееся центром чего-то :).
Рой Т.
Итак, я попытался сначала установить источник, как вы сказали, но после изменения метода draw () в Car на: mSprite.setPosition (mBody.getPosition (). X * C.P2M, mB ...) Он вернулся к тому же проблема
Free Lancer