使用XNA和Farseer Physics将特定方向的物体移动

我有一个自定义多边形附加到一个身体,看起来像这样: 自定义多边形附加到身体 我想要做的是让身体根据身体的尖端移动。 到目前为止,这是我所尝试的:

if (ks.IsKeyDown(Keys.Up)) { body.ApplyForce(new Vector2(0, -20),body.GetLocalPoint(new Vector2(0,0))); } if (ks.IsKeyDown(Keys.Left)) { body.ApplyTorque(-500); } if (ks.IsKeyDown(Keys.Right)) { body.ApplyTorque(500); } 

身体旋转良好 – 但是当我尝试使身体根据身体的尖端加速 – 假设我已经正确指定了尖端(我确信我没有),它只是旋转,就好像我已经应用了力矩到它。 任何人都可以指出我如何解决这个问题的正确方向?

按照Gajoo的建议,将力施加到物体中心。 世界中心是一个身体类的财产所以。

 Body.ApplyForce(forceDirection, Body.WorldCenter); 

另外,如果你想在特定的方向移动身体,你需要在这个方向施加力,所以“新的Vector2(0,-20)”没有任何意义。 要创建面向与您的身体相同方向的单位向量,请执行以下操作。

 var forceDirection = Vector2.UnitY; var test = Matrix.CreateFromAxisAngle(new Vector3(0, 0, 1), Body.Rotation); forceDirection = Vector2.Transform(facing, test); 

现在简单地缩放forceDirection向量来改变速度。

ApplyForce不能这样工作。 问题是你总是在你的形状的左下角施加一个力量,总是朝着同一个方向。 这里是一个解释它的图片(我可能错误地将这个力量应用到这个角落,但这个想法是一样的):

在这里输入图像描述

要解决这个问题,你应该总是把这个力施加到你的船的中心,其余的和在建议的byte56中解释的一样。 这意味着你需要自己旋转力vector,然后传递给更先进的

 direction = body.GetWorldVector(new Vector2(0,1)); 

使用Farseer物理计算方向并不那么困难。 如果你的身体开始向上,你可以通过在更新循环中更新方向(如上所示)来find方向,然后当用户按下向上键时,只需简单地应用(在计算速度之后由Byte56回答的问题: https ://gamedev.stackexchange.com/questions/37623/move-sprite-in-the-direction-it-is-facing )

 body.ApplyForce(velocity * -100); 

玩的价值,以获得所需的输出:)