我有一种围绕另一个精灵(行星)围绕精灵(舰队)轨道运行的方法。问题在于,随着时间的推移,舰队走得更远(非常缓慢,几乎不会引起注意,除非你让轨道运行几分钟)。
public void Orbit()
{
// Planet's position - fleet position
Vector2 distanceToDestination = currentLocation.Position - position;
// Calculate fleet's rotation ( - right angle so fleet rotates clockwise)
rotation = MathHelper.WrapAngle((float)Math.Atan2(distanceToDestination.Y, distanceToDestination.X)) - Helpers.RightAngle;
// Get the direction that the fleet is facing
direction = new Vector2((float)Math.Cos(rotation), (float)Math.Sin(rotation));
// Fleet position, thrust is set to 0.4f
position = Vector2.Add(position, direction * thrust);
// Fleet rectangle
rect = new Rectangle((int)position.X, (int)position.Y, fleetTexture.Width, fleetTexture.Height);
}
public static class Helpers
{
public const float RightAngle = (float)Math.PI / 2;
}
如果社区能够指出为什么我的舰队没有保持一致的轨道,我将不胜感激,这就是我想要实现的目标!非常感谢提前。
答案 0 :(得分:2)
如果我理解你在做什么,那么你正在尝试使用类似于围绕圆形行驶的汽车的模型来模拟轨道物理(即,你没有模拟垂直于当前速度的重力加速度和{ {3}})。相反,你这样做:
r
的圆心的中心d
现在,在每一步之后,你的物体离圆心有多远?那么,根据毕达哥拉斯定理,它是sqrt(r*r + d*d)
,它将略大于r
。为d
使用非常大的值来强调:
这应该说明你的漂移。
顺便说一句,您不需要使用trig函数来构造distanceToDestination的垂直。使用±Z向量简单地交叉它会容易得多,结果将是(在2d中)±(-distanceToDestination.Y, distanceToDestination.X)
。
更新:既然你没有真正模拟轨道物理,为什么不解析这个问题?
public static Vector2 Orbit(Vector2 center, Vector2 startPos, float speed, float time)
{
// positive speed means CCW around the center, negative means CW.
var radiusVec = (startPos - center);
var radius = radiusVec.Length();
var angularVelocity = speed / radius; // Add check for divide by zero
Vector2 perpendicularVec = new Vector2(-radiusVec.Y, radiusVec.X);
return center + (float)Math.Cos(time * angularVelocity) * radiusVec + (float)Math.Sin(time * angularVelocity) * perpendicularVec;
}
答案 1 :(得分:1)
这是你在计算的:
要获得轨道中的下一个点,你必须保持矢量长度。
所以你的计算应该是:
// Planet's position - fleet position
Vector2 distanceToDestination = currentLocation.Position - position;
// Calculate fleet's rotation ( - right angle so fleet rotates clockwise)
rotation = MathHelper.WrapAngle((float)Math.Atan2(distanceToDestination.Y, distanceToDestination.X));
rotation -= Helpers.RightAngle;
// Get the direction that the fleet is facing
direction = new Vector2((float)Math.Cos(rotation), (float)Math.Sin(rotation));
direction *= distanceToDestination.Length;
position = currentLocation.Position - direction;