1

我是 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);

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

干杯

4

2 回答 2

1

通常在这种情况下摆动的身体需要很长时间才能停下来(事实上我们有时会问如何让它停下来......)所以我猜测长而细的形状可能正在播放部分。与其他物理引擎一样,Box2D 在长而细的形状方面存在问题。

但这不是您的问题...要保持摆动不变,您需要手动设置每次摆动的速度,无论是在顶部还是在它通过摆动的中点时。我认为中点会更安全且不那么引人注目。

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

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

于 2012-04-15T09:29:42.023 回答
1

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

如果您需要钟摆与其他物理对象交互,请保留您现在拥有的东西,但随着模拟运行,调整它以使其继续运行;例如,每次它垂直摆动时,将线速度和角速度缩放到与第一次这样做时相同的大小(除非它例如撞到了什么东西,在这种情况下它不应该继续这样)。

如果你不需要它与任何东西交互,或者它不应该反应而只是推动其他物体,那么不要让它成为模拟刚体;而是根据当前时间对其进行动画处理(设置角度)。您的物理引擎可能有一个选项,用于移动但本身不被其他物体移动的对象,这可能是该BodyType属性。(我没有随时间变化的钟摆位置的公式,但我确信它在某处可用。)


我从您问题的另一份副本中看到(顺便说一句,请不要这样做;请让模组迁移您的问题)您不希望它进行交互,但确实想将其转换为未固定的(下落)身体和背部。我认为我上面描述的任何一种策略都可以解决这个问题,但第一种策略需要更少的摆弄来实现。

于 2012-04-15T13:20:52.830 回答