在Farseer Physics 3.3.1 / Box2d中创建无限摆振摆

时间:2012-04-15 05:30:18

标签: c# xna box2d farseer

我是Farseer Physics的新手并使用3.3.1版本。我正在寻求帮助,甚至乐意收到Box2d的答案,以确保我得到回复,因为我应该能够转换它! - 谢谢

...经过大量的修修补补后,我设法在屏幕上产生了一个薄的垂直矩形形状,我希望它能够在顶部前后摆动,直到我设定的角度(90度会很好)对于这个样本)。

当它接近顶部时我希望它减速,然后以刚刚来的方式回落,增加速度然后显然慢慢再次停在顶部。几乎如何摆动海盗船在主题公园工作。

这是我到目前为止的代码,它摆动了形状,但似乎在每次挥杆时都会失去速度,最终停下来:

float playerWidth = ConvertUnits.ToSimUnits(5), playerHeight = ConvertUnits.ToSimUnits(68);
playerPosition = ConvertUnits.ToSimUnits(-350, 0);
playerBody = BodyFactory.CreateRectangle(World, playerWidth, playerHeight, 2f, playerPosition);
playerBody.BodyType = BodyType.Dynamic;
// create player sprite based on player body
_rectangleSprite = new Sprite(ScreenManager.Assets.TextureFromShape(playerBody.FixtureList[0].Shape, MaterialType.Player, Color.Orange, 1f));
// Create swinging joint
var joint = JointFactory.CreateFixedRevoluteJoint(World, playerBody, ConvertUnits.ToSimUnits(0, -34), playerBody.Position);

如果有人也可以提供命令,我需要在鼠标点击或键盘命令处以当前角度暂停形状,然后在我放开鼠标点击时继续这将是非常棒的!

干杯

2 个答案:

答案 0 :(得分:1)

通常在这种情况下摆动的身体需要很长时间才能停下来(事实上我们这里有问题,有时候会问如何让它停下来......)所以我猜这长薄的形状可以正在扮演一个角色。像其他物理引擎一样,Box2D在长薄形状方面遇到了麻烦。

但这不是你的问题......为了让它保持不变,你需要在每次挥杆时手动设定速度,无论是在顶部还是在经过挥杆的中点时。我认为中点会更安全,更不明显。

这个钟摆是否需要碰到其他物体?它可能看起来很奇怪,如果它拾起一个较重的物体但没有减速,或者它减速直到它达到你加速的速度,然后突然变得更快。如果它不需要以动态的方式做出反应,那么你可以通过设置每帧适当的角速度来控制自己的运动体更好。

运动体也可以使问题的最后一部分变得更简单,因为你可以将速度设置为零,直到你准备再次移动为止。要通过动态身体/关节设置获得此效果,您需要记下当前的线性和角速度,然后在不应移动的每一帧中取消身体的重力,然后恢复速度以保持它再次移动。但是如果在这段时间内有任何问题,那么这个技巧就会失败。你也可以暂时将关节限制(下/上)设置为相同的角度,以迫使关节保持摆的静止,但我确实怀疑5x68大小的身体在这些限制下会很好地发挥作用。

答案 1 :(得分:1)

任何非专用的钟摆模拟都可能会随着时间的推移而失去能量。

如果您需要摆锤与其他物理对象进行交互,那么请保留现有的物体,但在模拟运行时,请调整它以使其继续运行;例如,每当它在垂直方向上摆动时,将线性和角速度缩放到相同的幅度,这是它第一次这样做(除非它例如击中某些情况,否则它不应该继续前进那样的。)

如果你不需要它与任何东西进行交互,或者它不应该反应而只是推动其他物体,那么就不要让它成为模拟的刚体;而是根据当前时间对其进行动画处理(设置角度)。您的物理引擎可能有一个选项可以移动但不会被其他实体移动,并且它可能是BodyType属性。 (随着时间的推移,我不会随便得到摆锤位置的公式,但我确信它可以在某个地方使用。)


我从你问题的另一个副本中看到了(顺便说一句,请不要这样做;要求mod转换你的问题),你不希望它进行交互,但是想把它转换成一个未固定(下降)的身体和背部。我认为我上面描述的任何一种策略都可以解决这个问题,但第一种策略需要更少的小工具才能实现。