2010-06-24 89 views
0

我遇到问题了,我尝试了所有可能的组合。我试图让我的球基本上尽可能快地飞离屏幕。唯一的问题是不管我设定的值是否以相同的速度移动。我试过 ballBody.SetLinearVelocity(new Vector2(1000000f,0));BOX2D XNA的加速度/速度

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

此相关帖子帮助吗? http://stackoverflow.com/questions/2576697/box2d-maximum-possible-linear-velocity – 2010-06-25 05:07:56

回答

3

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

您应该注意,在文档中提到了Box2D在0.1到10.0之间的长度效果最好。根据作者的说法,这是以米为单位的想象,并适合模拟棒球,桶和巴士等物体。除此之外,它对数字不准确性更加敏感。

尝试缩小您的坐标系,以便您的平均模拟物体(一个球也许)的大小为1.0个单位。这将有助于Box2D以最佳方式模拟您的系统。

鉴于这种操作范围,超过10或100单位/秒的速度可能会导致问题,尤其是当您将它们应用于接受大动量的动态物体时。如果这些高动量的身体与其他身体碰撞,势头就会蔓延,整个系统可能会飞走或变得不稳定。

由于这个原因,一旦它应该飞走,最好将球转变成运动体。运动体根据速度移动,但不会相互碰撞,也不受力作用。我不确定,但运动机构可能因为没有动量数据而允许更高的速度。

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