Example #1
0
    public void InitFromOrbitData(OrbitData od)
    {
        // a is inited from perihilion
        perihelion_phys = od.perihelion;
        // @TODO: This should be in selected units!
        perihelion  = GravityScaler.ScaleDistancePhyToScene(od.perihelion);
        ecc         = od.ecc;
        omega_lc    = od.omega_lc;
        omega_uc    = od.omega_uc;
        inclination = od.inclination;
        phase_nu    = od.phase * Mathf.Deg2Rad;
        // normally a should be negative, but we made it positive...
        p = od.a * (1 - ecc * ecc);
        //
        float   denom = 1 + ecc * Mathf.Cos(phase_nu);
        Vector3 r_pqw = new Vector3(p * Mathf.Cos(phase_nu) / denom, p * Mathf.Sin(phase_nu) / denom, 0);

        r_initial_phy = r_pqw.magnitude;

        initFromOrbitData = true;
        Init();
        PreEvolve(GravityEngine.Instance().physToWorldFactor, GravityEngine.Instance().massScale);
    }
Example #2
0
    /// <summary>
    ///  Draw a circle at SOI radius around the moon
    /// </summary>
    /// <param name="physRadius">radius in physics units</param>
    private void Draw(float physRadius)
    {
        const int numPoints = 200;

        Vector3[] points = new Vector3[numPoints];

        float radius = GravityScaler.ScaleDistancePhyToScene(physRadius);

        float dtheta = 2f * Mathf.PI / (float)numPoints;
        float theta  = 0;

        // add a fudge factor to ensure we go all the way around the circle
        for (int i = 0; i < numPoints; i++)
        {
            points[i]  = new Vector3(radius * Mathf.Cos(theta), radius * Mathf.Sin(theta), 0);
            points[i]  = Quaternion.AngleAxis(inclination, Vector3.right) * points[i];
            points[i] += moonBody.transform.position;
            theta     += dtheta;
        }
        // close the path (credit for fix to R. Vincent)
        points[numPoints - 1]     = points[0];
        soiRenderer.positionCount = numPoints;
        soiRenderer.SetPositions(points);
    }