簡體   English   中英

libGDX:Box2D速度不夠快

[英]libGDX: Box2D velocity not increasing enough

如果有一個游戲項目正在使用box2d。 現在,在我的MovementSystem中(我使用的是基於實體組件的方法),我希望Box2D根據控件設置的所需速度將對象向四周移動。

不幸的是,速度似乎永遠不會變得很高。 做一個即使當applyLinearImpulse用的速度矢量(期望速度) 245044.23每個軸例如,所得到的主體的速度剛剛成為一些有關90.0 我做錯了什么? 有限制嗎?

這是我運行速度更新和世界步的代碼:

//************************
// physics-system
//************************
public void update(float deltaTime) {

        float frameTime = Math.min(deltaTime, 0.25f);
        accumulator += frameTime;
        if (accumulator >= MAX_STEP_TIME) {

            world.step(MAX_STEP_TIME, 6, 2);
            accumulator -= MAX_STEP_TIME;

            for (Entity entity : entities) {
                TransformComponent transform = tim.get(entity);
                BodyComponent bodyComp = bod.get(entity);
                VelocityComponent velocity = vel.get(entity);

                Vector2 bodyVelocity = bodyComp.body.getLinearVelocity();
                float velChangeX = velocity.horizontalVelocity - bodyVelocity.x;
                float velChangeY = velocity.verticalVelocity - bodyVelocity.y;

                float impulseX = bodyComp.body.getMass() * velChangeX;
                float impulseY = bodyComp.body.getMass() * velChangeY;

                bodyComp.body.applyLinearImpulse(new Vector2(impulseX, impulseY), bodyComp.body.getWorldCenter(),
                        false);

                // update transform
                Vector2 position = bodyComp.body.getPosition();
                transform.x = (int) position.x;
                transform.y = (int) position.y;

                // slowingdownVelocitys(velocity);

            }
        }

    }

這是我目前唯一具有box2D-Component(稱為BodyComponent)的實體的定義:

        Entity entity = new Entity();
        //...
        BodyComponent bodyComponent = new BodyComponent();
        BodyDef bodyDef = new BodyDef();

        bodyDef.type = BodyDef.BodyType.DynamicBody;

        bodyDef.position.set(transformComponent.getX(), transformComponent.getY());

        bodyComponent.body = GameManager.getB2dWorld().createBody(bodyDef);
        bodyComponent.body.applyAngularImpulse(50f, true);

        CircleShape circle = new CircleShape();
        circle.setRadius(2f);

        FixtureDef fixtureDef = new FixtureDef();
        fixtureDef.shape = circle;
        fixtureDef.density = 10f;
        fixtureDef.friction = 0.4f;
        fixtureDef.restitution = 0.6f; // Make it bounce a little bit

        bodyComponent.body.createFixture(fixtureDef);

        circle.dispose();

        entity.add(bodyComponent);
        //... 

Box2D確實限制了速度。 基本上存在極限是為了避免浮點運算的不准確性。 正如您所發現的245044.23 ,速度為245044.23 (步長為1/60秒)遠高於此限制。 如果您可以將步進時間降低為每秒1/200000秒,則可以每秒模擬245044.23米,但我認為我們大多數人都難以實時運行它。 以每秒60步的步速(每個步僅為模擬秒的1/60),由於Box2D單位基本上是MKS單位(米,千克,秒),因此您所說的速度約為每步4084米。 同時,將速度限制限制為每步2米(通過b2_maxTranslation )。 可以增加此限制,但是隨着限制的增加,您更有可能看到較少的類似於物理的行為,例如隧道。

至於您做錯了什么,除了嘗試使用比Box2D可以處理的速度更高的速度之外,通常您所描述的問題都是所用視覺縮放的結果。 請記住,Box2D的位置以米為單位,而我們的大多數顯示器(水平或垂直方向)都比米小得多。 Box2D FAQ 關於像素縮放的說法是這樣的

假設您有一個用於100x100像素的角色的精靈。 您決定使用0.01的比例因子。 這將使角色物理框變為1m x 1m。 因此,制作一個1x1的物理盒子。 現在,假設字符從像素坐標(345,679)開始。 因此,將物理框定位在(3.45,6.79)。 現在模擬物理世界。 假設角色物理框移動到(2.31,4.98),因此將角色精靈移動到像素坐標(231,498)。 現在,唯一棘手的部分是選擇比例因子。 這確實取決於您的游戲。 您應該嘗試使移動的物體在0.1-10米的范圍內,最佳位置是1米。

您要回答的問題是使用何種縮放比例,以便Box2D可以處理的物理速度可以以可見的方式轉換為視覺效果。 在1/60秒(每步)的步進模擬中,Box2D將要處理的速度極限是每秒+/- 120米。 但是,通過巧妙地使用世界坐標和圖形坐標之間的縮放比例,可以達到每秒120個距離單位,在這種情況下,您可以將距離單位設置為千米或兆米或其他任何單位。

請注意,真正慢b2_velocityThreshold也會帶來問題-例如遇到碰撞響應的速度閾值( b2_velocityThreshold )。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM