Box2D WorldCenterと位置の違い


9

そのため、この問題は数日間続いています。まず、言うBody.getWorldCenter()とBody.getPosition()の違いは何ですか。WorldCenterは重心か何かに関係があるかもしれないと聞いた。

次に、スプ​​ライトのBox2Dボディを作成すると、ボディは常に左下隅にあります。box.getWorldCenter()の周りに1ピクセルの長方形を印刷して確認します。ボディがスプライトの中央にあり、バウンディングボックスがスプライトを包み込む必要があると私が理解していることから、正しいですか?

これが私が何を意味するかのイメージです(The Sprite is Red、Body Blue):

ここに画像の説明を入力してください

ここにいくつかのコードがあります:

ボディクリエーター:

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

1
したがって、レンダーループでこれを行うよりも原点を設定するほうがよいです:mSprite.setPosition(mBody.getPosition()。x * C.P2M-mSprite.getWidth()/ 2、mBody.getPosition()。y * ...) ?
無料ランサー

また、これは非常に奇妙ですが、非常に高速では、テクスチャはスプライトとボディの両方のバウンディングボックスよりも先に見えます。
無料ランサー

1
@FreeLancer原点を設定した方が良いのか、それとも図面をオフセットした方がいいのかについても、まったく同じ質問をしていました。
Amplify91 2012年

1
自分で図面をオフセットするか、原点の値を使用してBox2Dにオフセットさせるかは関係ありません。同じ計算がどこかで発生します。自分のコードでは、位置が何かの中心であると考えるのが簡単です:)。
ロイT.

さて、あなたが言ったように最初に原点を設定しようとしましたが、Carのdraw()メソッドを次のように変更した後:mSprite.setPosition(mBody.getPosition()。x * C.P2M、mB ...)同じに戻りました問題
無料ランサー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.