Fix most planet velocities

This commit is contained in:
Nick 2022-04-17 22:10:29 -04:00
parent f15157a124
commit 860ffd2c95
2 changed files with 34 additions and 9 deletions

View File

@ -25,7 +25,7 @@ namespace NewHorizons.Builder.Orbital
// Rotation // Rotation
initialMotion._initAngularSpeed = orbit.SiderealPeriod == 0 ? 0f : 2f * Mathf.PI / (orbit.SiderealPeriod * 60f); initialMotion._initAngularSpeed = orbit.SiderealPeriod == 0 ? 0f : 2f * Mathf.PI / (orbit.SiderealPeriod * 60f);
//initialMotion._primaryBody = primaryBody?.GetAttachedOWRigidbody(); initialMotion._primaryBody = primaryBody?.GetAttachedOWRigidbody();
var rotationAxis = Quaternion.AngleAxis(orbit.AxialTilt + 90f, Vector3.right) * Vector3.up; var rotationAxis = Quaternion.AngleAxis(orbit.AxialTilt + 90f, Vector3.right) * Vector3.up;
initialMotion._rotationAxis = rotationAxis; initialMotion._rotationAxis = rotationAxis;
@ -40,7 +40,8 @@ namespace NewHorizons.Builder.Orbital
var secondaryGravity = new Gravity(secondaryBody.GetGravityVolume()); var secondaryGravity = new Gravity(secondaryBody.GetGravityVolume());
var velocity = orbit.GetOrbitalParameters(primaryGravity, secondaryGravity).InitialVelocity; var velocity = orbit.GetOrbitalParameters(primaryGravity, secondaryGravity).InitialVelocity;
initialMotion._cachedInitVelocity = velocity + primaryBody?.GetComponent<InitialMotion>()?.GetInitVelocity() ?? Vector3.zero; var parentVelocity = primaryBody?.GetComponent<InitialMotion>()?.GetInitVelocity() ?? Vector3.zero;
initialMotion._cachedInitVelocity = velocity + parentVelocity;
initialMotion._isInitVelocityDirty = false; initialMotion._isInitVelocityDirty = false;
} }
} }
@ -50,7 +51,6 @@ namespace NewHorizons.Builder.Orbital
initialMotion._initLinearSpeed = 0f; initialMotion._initLinearSpeed = 0f;
} }
body.SetActive(true); body.SetActive(true);
return initialMotion; return initialMotion;

View File

@ -53,9 +53,34 @@ namespace NewHorizons.Components.Orbital
var p = semiMajorAxis * (1 - (eccentricity * eccentricity)); // Semi-latus rectum var p = semiMajorAxis * (1 - (eccentricity * eccentricity)); // Semi-latus rectum
var r = p / (1 + eccentricity * Mathf.Cos(f)); var r = p / (1 + eccentricity * Mathf.Cos(f));
var mu = GravityVolume.GRAVITATIONAL_CONSTANT * primaryMass;
var h = Mathf.Sqrt(mu * p); var G = GravityVolume.GRAVITATIONAL_CONSTANT;
var v = Mathf.Sqrt(mu * ((2 / r) - (1 / semiMajorAxis))); var mu = G * (primaryMass + secondaryMass);
var r_p = semiMajorAxis * (1 - eccentricity);
var r_a = semiMajorAxis * (1 + eccentricity);
float v;
if(primaryGravity.Power == 1)
{
// Have to deal with a limit
if(eccentricity == 0)
{
var v2 = 2 * mu * (Mathf.Log(r_a / r) + (1 / 2f));
v = Mathf.Sqrt(v2);
}
else
{
var coeff = (r_p * r_p) / (r_p * r_p - r_a * r_a);
var v2 = 2 * mu * secondaryMass * (coeff * Mathf.Log(r_p / r_a) + Mathf.Log(r_a / r));
v = Mathf.Sqrt(v2);
}
}
else
{
v = Mathf.Sqrt(G * primaryMass * ((2f / r) - (1f / semiMajorAxis)));
}
var semiMinorAxis = semiMajorAxis * Mathf.Sqrt(1 - (eccentricity * eccentricity)); var semiMinorAxis = semiMajorAxis * Mathf.Sqrt(1 - (eccentricity * eccentricity));
var focusDistance = Mathf.Sqrt((semiMajorAxis * semiMajorAxis) - (semiMinorAxis * semiMinorAxis)); var focusDistance = Mathf.Sqrt((semiMajorAxis * semiMajorAxis) - (semiMinorAxis * semiMinorAxis));
@ -72,10 +97,10 @@ namespace NewHorizons.Components.Orbital
var pos = new Vector3(r * n_p.x, 0f, r * n_p.y); var pos = new Vector3(r * n_p.x, 0f, r * n_p.y);
var vel = new Vector3(v * n_v.x, 0f, v * n_v.y); var vel = new Vector3(v * n_v.x, 0f, v * n_v.y);
orbitalParameters.InitialPosition = R3 * pos; orbitalParameters.InitialPosition = R1 * R2 * R3 * pos;
orbitalParameters.InitialVelocity = R3 * vel; orbitalParameters.InitialVelocity = R1 * R2 * R3 * vel;
Logger.Log($"POSITION: {orbitalParameters.InitialPosition}, {orbitalParameters.InitialVelocity}, {n_p}, {n_v}"); Logger.Log($"POSITION: {orbitalParameters.InitialPosition}, {orbitalParameters.InitialVelocity}, {n_p}, {n_v}, {primaryMass}");
/* /*
var x = r * (Mathf.Cos(la) * Mathf.Cos(ap + f) - Mathf.Sin(la) * Mathf.Sin(ap + f) * Mathf.Cos(i)); var x = r * (Mathf.Cos(la) * Mathf.Cos(ap + f) - Mathf.Sin(la) * Mathf.Sin(ap + f) * Mathf.Cos(i));