mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
59 lines
2.0 KiB
C#
59 lines
2.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
using NewHorizons.Utility;
|
|
using Logger = NewHorizons.Utility.Logger;
|
|
|
|
namespace NewHorizons.OrbitalPhysics
|
|
{
|
|
public static class OrbitalHelper
|
|
{
|
|
public enum FalloffType
|
|
{
|
|
inverseSquared,
|
|
linear,
|
|
none
|
|
}
|
|
|
|
public static float GetOrbitalVelocity(float distance, Gravity gravity, KeplerElements kepler)
|
|
{
|
|
if (kepler.Eccentricity == 0) return GetCircularOrbitVelocity(distance, gravity, kepler);
|
|
|
|
if (gravity.Exponent == 2)
|
|
{
|
|
return Mathf.Sqrt(GravityVolume.GRAVITATIONAL_CONSTANT * gravity.Mass * (2f / distance - 1f / kepler.SemiMajorAxis));
|
|
}
|
|
if(gravity.Exponent == 1)
|
|
{
|
|
var mu = GravityVolume.GRAVITATIONAL_CONSTANT * gravity.Mass;
|
|
var rp2 = kepler.Periapsis * kepler.Periapsis;
|
|
var ra2 = kepler.Apoapsis * kepler.Apoapsis;
|
|
float term1 = 0;
|
|
if(kepler.Eccentricity < 1)
|
|
term1 = mu * Mathf.Log(kepler.Periapsis / kepler.Apoapsis) * rp2 / (rp2 - ra2);
|
|
var term2 = mu * Mathf.Log(kepler.Apoapsis / distance);
|
|
return Mathf.Sqrt(2 * (term1 + term2));
|
|
}
|
|
Logger.LogError($"Invalid exponent {gravity.Exponent}");
|
|
return 0f;
|
|
}
|
|
|
|
public static float GetCircularOrbitVelocity(float distance, Gravity gravity, KeplerElements kepler)
|
|
{
|
|
if (gravity.Exponent == 2)
|
|
{
|
|
return Mathf.Sqrt(GravityVolume.GRAVITATIONAL_CONSTANT * gravity.Mass / distance);
|
|
}
|
|
if(gravity.Exponent == 1)
|
|
{
|
|
return Mathf.Sqrt(GravityVolume.GRAVITATIONAL_CONSTANT * gravity.Mass);
|
|
}
|
|
Logger.LogError($"Invalid exponent {gravity.Exponent}");
|
|
return 0f;
|
|
}
|
|
}
|
|
}
|