Java libGDX:Box2D速度增加不够

Java libGDX:Box2D速度增加不够,java,libgdx,box2d,Java,Libgdx,Box2d,如果有一个游戏项目,我使用的是box2d。现在在我的MovementSystem(我使用基于实体组件的方法)中,我希望Box2D根据控件设置的所需速度在周围移动对象 不幸的是,速度似乎永远不够高。例如,即使对每个轴执行速度向量(所需速度)为245044.23的applyLinearImpulse时,物体的最终速度也会变成90.0。我做错了什么?有什么限制吗 以下是我运行velocity update和world步骤的代码: //************************ // physic

如果有一个游戏项目,我使用的是box2d。现在在我的MovementSystem(我使用基于实体组件的方法)中,我希望Box2D根据控件设置的所需速度在周围移动对象

不幸的是,速度似乎永远不够高。例如,即使对每个轴执行速度向量(所需速度)为
245044.23
applyLinearImpulse
时,物体的最终速度也会变成
90.0
。我做错了什么?有什么限制吗

以下是我运行velocity update和world步骤的代码:

//************************
// 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组件(称为BodyComponent)的实体的定义:


Box2D确实限制了速度是的。该限制基本上是为了避免数据的不准确。速度
245044.23
的步进时间为1/60秒远高于您发现的这个极限。如果你能把你的步进时间降低到1/200000秒,你就可以模拟每秒245044.23米,但我认为我们大多数人在实时运行时都会遇到困难。在每秒60步的步速下(每一步仅为模拟秒的1/60),您所述的速度约为每步4084米,因为Box2D单位基本上是MKS单位(米、千克、秒)。同时,每一步的速度限制为每一步2米(通过
b2\u maxTranslation
)。这一限制可以增加,但随着它的增加,你更可能看到像隧道这样的物理行为

至于你做错了什么,除了尝试使用比Box2D处理速度更高的方式外,你所描述的问题通常是使用视觉缩放的结果。请记住,Box2D位置以米为单位,而我们的大多数显示器(在水平或垂直方向上)都比米小得多。Box2D常见问题解答中有这样一句话:

假设您的角色有一个100×100像素的精灵。你 决定使用0.01的比例因子。这将使 字符物理框1m x 1m。所以去做一个物理盒子,它是1x1。 现在假设角色从像素坐标(345679)开始。所以 将物理框放置在(3.45,6.79)处。现在模拟物理 世界。假设角色物理框移动到(2.31,4.98),则移动 将角色精灵转换为像素坐标(231498)。现在唯一的 棘手的部分是选择一个比例因子。这真的取决于你的 游戏您应该尝试使移动对象的范围在0.1-10之间 米,其中1米是最佳点

您要回答的问题是,要使用什么样的缩放比例,以便Box2D可以处理的物理速度能够以一种仍然可以看到的方式转化为视觉效果。在1/60秒(每步)的步长模拟中,Box2D将处理的速度极限为+/-120米/秒。但是,通过巧妙地使用世界坐标和图形坐标之间的缩放,可以达到每秒120个距离单位,其中可以将距离单位设置为公里或万亿米或其他任何单位

请注意,速度过慢也会带来问题,比如碰撞响应的速度阈值(
b2\u velocityThreshold


希望这有帮助 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); //...