Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Farseer Physics 3.3.1/Box2d中创建无限振荡摆_C#_Xna_Box2d_Farseer - Fatal编程技术网

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

C# 在Farseer Physics 3.3.1/Box2d中创建无限振荡摆,c#,xna,box2d,farseer,C#,Xna,Box2d,Farseer,我不熟悉Farseer Physics并使用3.3.1版。我需要一些帮助,甚至会很高兴收到Box2d答案,以确保我得到响应,因为我应该能够转换它谢谢 …经过大量的修补,我成功地在屏幕上生成了一个薄的垂直矩形形状,我希望它能够在顶部来回摆动并固定到我设定的角度(对于这个示例,90度就可以了) 当它接近顶端时,我希望它放慢速度,然后像刚才那样向后退,提高速度,然后明显地放慢速度,再次停在顶端。一艘摇摆不定的海盗船在主题公园里是如何工作的 这是迄今为止我掌握的摆动形状的代码,但每次摆动时似乎都会失去速

我不熟悉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);
如果有人也可以提供命令,我将需要暂停形状的鼠标点击或键盘命令在它的当前角度,然后继续当我放开鼠标点击,这将是超级棒


干杯

通常,在这种情况下摆动的身体需要很长时间才能停下来(事实上,我们有时会问如何让它停下来……),所以我猜长而细的形状可能会起作用。与其他物理引擎一样,Box2D在处理细长形状时也存在问题

但这不是你的问题。。。要使其摆动保持不变,您需要手动设置每次摆动的速度,无论是在顶部还是在它经过摆动的中点时。我认为中点会更安全,不那么显眼

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


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

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

如果需要钟摆与其他物理对象交互,则保留现有的钟摆,但在模拟运行时,调整钟摆以保持其运行;例如,每次它在垂直方向上摆动时,将线速度和角速度缩放到与第一次相同的大小(除非它击中了某个物体,在这种情况下它不应该继续这样做)

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



我从你的问题的另一份副本中看到(顺便说一句,不要这样做;让mods迁移你的问题),你不想让它相互作用,但确实想把它转换成一个未固定(下落)的身体并返回。我认为我上面描述的任何一种策略都可以解决这个问题,但第一种策略的实施需要更少的麻烦。

嘿,谢谢你的详细回答,不,钟摆永远不会撞到其他物体上,所以任何欺骗都可以:)但它可能会断开它的关节,自由落体,然后在世界其他地方的一端重新建立销/旋转接头。鉴于我是一个新手,我理解你所说的理论,但是你能提供更多的细节来帮助我开始编写代码吗?你是不是建议我还是用Farseer来完成这部分?如何记录每帧的速度和抵消重力?请不要在SE上交叉张贴。