Sự khác biệt của Box2D giữa WorldCenter và Position


9

Vì vậy, vấn đề này đã được anh em trong một vài ngày nay. Trước hết, sự khác biệt giữa nói Body.getWorldCenter () và Body.getPocation (). Tôi nghe nói rằng WorldCenter có thể phải làm với trọng tâm hoặc một cái gì đó.

Thứ hai, khi tôi tạo một Box2D Body cho sprite, Body luôn ở góc dưới bên trái. Tôi kiểm tra nó bằng cách in Hình chữ nhật 1 pixel xung quanh hộp.getWorldCenter (). Từ những gì tôi hiểu Thân thể nên ở trung tâm của Sprite và hộp giới hạn của nó sẽ bao quanh Sprite, đúng không?

Đây là hình ảnh của những gì tôi muốn nói (The Sprite là Red, Body Blue):

nhập mô tả hình ảnh ở đây

Đây là một số mã:

Người tạo cơ thể:

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

Tạo 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 );
}

Câu trả lời:


10

Trước hết, sự khác biệt giữa nói Body.getWorldCenter () và Body.getPocation ().

Body.getWorldCenter()là trọng tâm. Body.getPosition()là trung tâm của AABB. Đối với một hộp hoặc vòng tròn đơn giản, chúng sẽ giống nhau tuy nhiên nếu cơ thể bạn không cân bằng (ví dụ: nhiều đồ đạc / w mật độ khác nhau) thì chúng sẽ khác nhau. Cũng thử đặt nguồn gốc của bạn trước vị trí.

Vì thế

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

thay vì

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

1
Vì vậy, thiết lập nguồn gốc tốt hơn so với thực hiện điều này trong vòng lặp kết xuất: mSprite.setP vị trí (mBody.getP vị trí (). X * C.P2M - mSprite.getWidth () / 2, mBody.getP vị trí (). Y * ...) ?
Lancer miễn phí

Ngoài ra, điều này thực sự kỳ lạ, nhưng có vẻ như ở tốc độ thực sự cao, Texture dường như đi trước cả hai hộp Sprite và Body ràng buộc.
Lancer miễn phí

1
@FreeLancer Tôi đã suy nghĩ chính xác câu hỏi tương tự về việc sẽ tốt hơn nếu đặt gốc hoặc bù bản vẽ.
Amplify91

1
Sẽ không có vấn đề gì nếu bạn tự bù đắp bản vẽ hoặc nếu bạn để Box2D bù lại bằng cách sử dụng giá trị gốc. Các tính toán tương tự xảy ra ở đâu đó. Thật dễ dàng để lý luận trong mã của riêng bạn vì vị trí là trung tâm của một cái gì đó :).
Roy T.

Ok, vì vậy tôi đã thử đặt gốc trước như bạn đã nói nhưng sau khi thay đổi phương thức draw () của Car thành: mSprite.setPocation (mBody.getPocation (). X * C.P2M, mB ...) Nó đã trở lại như cũ vấn đề
Lancer miễn phí
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.