我正在尝试创建一个能够获取一个点和一个距离的函数,并在该距离的圆圈中给我一个氡位置。例如
SpawnPlanet(PlanetToOrbitAround,Distance 200 px)返回距离行星200像素的“圆圈”中的一个点。
我也在寻找实际的旋转逻辑,所以我产生了一个星球,我有一个方法
UpdateRotation(PlanetToOrbitAround,OrbitingPlanet,200 px距离,5度速度)
我在数学方面很糟糕,我找到了一些例子,我发现的一切似乎对我都不起作用(可能是因为我对所涉及的数学缺乏了解)。旋转似乎适用于围绕太阳的行星,但不适用于行星周围的月球
public Vector2 RotateAboutOrigin(Vector2 point,Vector2 origin,float rotation) { 返回Vector2.Transform(point - origin,Matrix.CreateRotationZ(rotation))+ origin; }
是我正在使用的逻辑..这样的调用......
mPlanetLocation = RotateAboutOrigin(mPlanetLocation, new Vector2(GraphicsDevice.Viewport.Width / 2 - 25, GraphicsDevice.Viewport.Height / 2 - 25), .005f);
mMoonLocation = RotateAboutOrigin(mMoonLocation, mPlanetLocation, .005f);
月亮奇怪地旋转而且长圆形。任何帮助都会很棒!
答案 0 :(得分:3)
我在游戏中经历过这个问题!
我有一个用于行星和其他空间物体的基类。它们包含简单属性,例如Position
,Origin
,Distance
和“角度”。
角度属性使用设定器根据所需的角度,与太阳/物体的距离以及中心的位置+原点来改变位置。
public float Angle
{
get { return angle; }
set
{
angle = value;
position = Rotate(MathHelper.ToRadians(angle), Distance, SunPosition + Origin);
}
}
public static Vector2 Rotate(float angle, float distance, Vector2 centrer)
{
return new Vector2((float)(distance * Math.Cos(angle)), (float)(distance * Math.Sin(angle))) + center;
}
使用此功能,您可以轻松执行SpawnPlanet(SunPosition, Distance)
之类的操作,并在每次更新时按X值更新角度。 (planet.Angle += X
)
您正在做的事情几乎相同,但请查看此代码是否与您的算法匹配。对于奇怪的月球形状,你能展示一些更多的代码并展示一个轨道的例子吗?