试图编写行星轨道数学

时间:2014-01-26 02:44:00

标签: c# .net math xna monogame

我正在尝试创建一个能够获取一个点和一个距离的函数,并在该距离的圆圈中给我一个氡位置。例如

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

月亮奇怪地旋转而且长圆形。任何帮助都会很棒!

1 个答案:

答案 0 :(得分:3)

我在游戏中经历过这个问题!

enter image description here

我有一个用于行星和其他空间物体的基类。它们包含简单属性,例如PositionOriginDistance和“角度”。

角度属性使用设定器根据所需的角度,与太阳/物体的距离以及中心的位置+原点来改变位置。

    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

您正在做的事情几乎相同,但请查看此代码是否与您的算法匹配。对于奇怪的月球形状,你能展示一些更多的代码并展示一个轨道的例子吗?