我遇到了问题,我尝试了所有可能的组合。我试图让我的球基本上尽快飞出屏幕。唯一的问题是无论我设定什么值,它只是以相同的速度移动。我试过了 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);
答案 0 :(得分:3)
由于数值稳定性,Box2D中存在最大线速度。但是,它设置得足够高,你不应该在正常使用时击中它。
您应该注意,并且在文档中提到,Box2D在长度介于0.1和10.0之间时效果最佳。根据作者的说法,这可以用米来设想,并且适合模拟从棒球到桶和公共汽车的物体。除此之外,它对数字不准确性变得更加敏感。
尝试按比例缩小坐标系,使平均模拟对象(可能是一个球)的大小为1.0个单位。这将有助于Box2D以最佳方式模拟您的系统。
鉴于此操作范围,超过10或100单位/秒的速度可能会导致问题,特别是如果您将它们应用于接收大量动力的动态身体。如果这些高动量的物体与其他物体发生碰撞,那么势头就会扩散,整个系统最终可能会飞走/变得不稳定。
出于这个原因,一旦它应该飞走,最好将球变成运动体。运动体根据速度移动但不会碰撞并且不会受到力的作用。我不确定但是运动物体可能被允许更高的速度,因为它们没有动量数据。
编辑: 此外,通常不应使用高于1.0f的恢复系数。这样做会导致身体在碰撞过程中获得动能。这在现实世界中并非不可能,但需要一些能源。想象一下,附着在身体上的化合物会在撞击时爆炸,从而将更多的能量泵入系统。