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