0

我遇到了问题,我尝试了所有可能的组合。我试图让我的球尽可能快地飞出屏幕。唯一的问题是无论我设置什么值,它都会以相同的速度移动。我试着做 ballBody.SetLinearVelocity(new Vector2(1000000f, 0));

ballBody.SetLinearVelocity(new Vector2(10f, 0));

中间的每一个数字,球仍然以相同的速度移动。我到底做错了什么。正文的代码也在下面。我想要的只是让球跑得非常快,就像弹球机一样。

        var bodyDef = new BodyDef();
        bodyDef.position = new Vector2(400, 200);

        bodyDef.type = BodyType.Dynamic;
        bodyDef.fixedRotation = true;


        ballBody = world.CreateBody(bodyDef);

        var circleShape = new CircleShape();
        circleShape._radius = 12.5f;

        var fixtureDef = new FixtureDef();
        fixtureDef.restitution = 1.4f;
        fixtureDef.shape = circleShape;
        fixtureDef.friction = 0;


        ballBody.CreateFixture(fixtureDef);
4

1 回答 1

3

由于数值稳定性,Box2D 中存在最大线速度。但是,它设置得足够高,以至于您在正常使用时永远不应该碰到它。

您应该注意,这在文档中提到,Box2D 在 0.1 到 10.0 之间的长度时效果最好。根据作者的说法,这是以米为单位的设想,使其适合模拟从棒球到桶再到公共汽车的物体。除此之外,它对数值不准确变得更加敏感。

尝试缩小您的坐标系,使您的平均模拟对象(可能是一个球)的大小为 1.0 个单位。这将帮助 Box2D 以最佳方式模拟您的系统。

鉴于此操作范围,超过 10 或 100 个单位/秒的速度可能会导致问题,尤其是当您将它们应用于接收巨大动量的动态物体时。如果这些高动量物体与其他物体发生碰撞,动量就会扩散,你的整个系统可能最终会飞走/变得不稳定。

出于这个原因,最好将球变成运动体,一旦它应该飞走。运动体根据速度移动,但不会发生碰撞,也不会受到力的作用。我不确定,但运动体可能允许更高的速度,因为它们不携带动量数据。

编辑:此外,您通常不应使用高于 1.0f 的恢复系数。这样做会导致身体在碰撞过程中获得动能。这在现实世界中并非不可能,但需要一些能源。想象一下附着在身体上的化合物在撞击时会爆炸,从而导致更多的能量被泵入系统。

于 2010-06-29T09:06:35.707 回答