From b56429c87b9de1af3af26ed4414bc30c80ae5592 Mon Sep 17 00:00:00 2001 From: JoJo Date: Thu, 30 Dec 2021 03:16:12 -0800 Subject: [PATCH] Some minor rework --- .../Builder/General/DetectorBuilder.cs | 13 ++-- .../Builder/General/HeavenlyBodyBuilder.cs | 17 ++++- .../Builder/Orbital/InitialMotionBuilder.cs | 2 +- NewHorizons/Main.cs | 2 +- NewHorizons/OrbitalPhysics/OrbitalHelper.cs | 71 ++++--------------- .../OrbitalPhysics/ParameterizedOrbitLine.cs | 38 ---------- 6 files changed, 41 insertions(+), 102 deletions(-) diff --git a/NewHorizons/Builder/General/DetectorBuilder.cs b/NewHorizons/Builder/General/DetectorBuilder.cs index 593b9ebd..7aa5551f 100644 --- a/NewHorizons/Builder/General/DetectorBuilder.cs +++ b/NewHorizons/Builder/General/DetectorBuilder.cs @@ -149,14 +149,19 @@ namespace NewHorizons.Builder.General secondaryAO.SetKeplerCoordinatesFromTrueAnomaly(ecc, r2 / (1f - ecc), i, l, p, 180); // Make sure positions are right - primary.transform.position = point.transform.position + OrbitalHelper.GetPosition(primaryAO); - secondary.transform.position = point.transform.position + OrbitalHelper.GetPosition(secondaryAO); + var gravity = new OrbitalHelper.Gravity(exponent, totalMass); + + var primaryCat = OrbitalHelper.GetCartesian(gravity, primaryAO); + var secondaryCat = OrbitalHelper.GetCartesian(gravity, secondaryAO); + + primary.transform.position = point.transform.position + primaryCat.Item1; + secondary.transform.position = point.transform.position + secondaryCat.Item1; Logger.Log($"Primary AO: [{primaryAO}], Secondary AO: [{secondaryAO}]"); // Finally we update the speeds - var v1 = OrbitalHelper.GetVelocity(new OrbitalHelper.Gravity(exponent, totalMass), primaryAO); - var v2 = OrbitalHelper.GetVelocity(new OrbitalHelper.Gravity(exponent, totalMass), secondaryAO); + var v1 = primaryCat.Item2; + var v2 = primaryCat.Item2; var focalPointMotion = point.gameObject.GetComponent(); var focalPointVelocity = focalPointMotion == null ? Vector3.zero : focalPointMotion.GetInitVelocity(); diff --git a/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs b/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs index 1636bab9..e11e781f 100644 --- a/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs +++ b/NewHorizons/Builder/General/HeavenlyBodyBuilder.cs @@ -1,6 +1,8 @@ using NewHorizons.External; using NewHorizons.OrbitalPhysics; using NewHorizons.Utility; +using OWML.Common; +using PacificEngine.OW_CommonResources.Game; using PacificEngine.OW_CommonResources.Game.Resource; using PacificEngine.OW_CommonResources.Game.State; using PacificEngine.OW_CommonResources.Geometry.Orbits; @@ -20,10 +22,13 @@ namespace NewHorizons.Builder.General public static void Make(GameObject body, IPlanetConfig config, float SOI, GravityVolume bodyGravity, InitialMotion initialMotion) { var size = new Position.Size(config.Base.SurfaceSize, SOI); - var G = GravityVolume.GRAVITATIONAL_CONSTANT; - var gravity = Gravity.of(bodyGravity == null ? 2f : bodyGravity.GetFalloffExponent(), bodyGravity == null ? 0 : bodyGravity.GetStandardGravitationalParameter() / G); + var gravity = getGravity(bodyGravity); var parent = GetBody(config.Orbit.PrimaryBody); var orbit = OrbitalHelper.KeplerCoordinatesFromOrbitModule(config.Orbit); + if (parent == HeavenlyBody.None) + { + Helper.helper.Console.WriteLine($"Could not find planet ({config.Name}) reference to its parent {config.Orbit.PrimaryBody}", MessageType.Warning); + } var hb = GetBody(config.Name); if (hb == null) @@ -37,6 +42,14 @@ namespace NewHorizons.Builder.General Planet.defaultMapping = mapping; } + private static Gravity getGravity(GravityVolume volume) + { + var exponent = volume._falloffType != GravityVolume.FalloffType.linear ? 2f : 1f; + var mass = (volume._surfaceAcceleration * Mathf.Pow(volume._upperSurfaceRadius, exponent)) / GravityVolume.GRAVITATIONAL_CONSTANT; + + return Gravity.of(exponent, mass); + } + private static HeavenlyBody AddHeavenlyBody(string name) { var hb = new HeavenlyBody(name); diff --git a/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs b/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs index ffb51a83..c41a352e 100644 --- a/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs +++ b/NewHorizons/Builder/Orbital/InitialMotionBuilder.cs @@ -38,7 +38,7 @@ namespace NewHorizons.Builder.Orbital var gv = primaryBody.GetGravityVolume(); if(gv != null) { - var velocity = OrbitalHelper.GetVelocity(new OrbitalHelper.Gravity(primaryBody.GetGravityVolume()), orbit); + var velocity = OrbitalHelper.GetCartesian(new OrbitalHelper.Gravity(primaryBody.GetGravityVolume()), orbit).Item2; // For some stupid reason the InitialMotion awake method transforms the perfectly fine direction vector you give it so we preemptively do the inverse so it all cancels out initialMotion._initLinearDirection = body.transform.InverseTransformDirection(velocity.normalized); diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index a2c5806d..6ba1f0fc 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -279,7 +279,7 @@ namespace NewHorizons // Now that we're done move the planet into place go.transform.parent = Locator.GetRootTransform(); - go.transform.position = OrbitalHelper.GetPosition(body.Config.Orbit) + primaryBody.transform.position; + go.transform.position = OrbitalHelper.GetCartesian(new OrbitalHelper.Gravity(1, 100), body.Config.Orbit).Item1 + primaryBody.transform.position; if (go.transform.position.magnitude > FurthestOrbit) { diff --git a/NewHorizons/OrbitalPhysics/OrbitalHelper.cs b/NewHorizons/OrbitalPhysics/OrbitalHelper.cs index a70bd305..44e921a3 100644 --- a/NewHorizons/OrbitalPhysics/OrbitalHelper.cs +++ b/NewHorizons/OrbitalPhysics/OrbitalHelper.cs @@ -24,21 +24,6 @@ namespace NewHorizons.OrbitalPhysics none } - public static Vector3 GetPosition(OrbitModule orbit) - { - Vector3 pos = Vector3.zero; - if(orbit.SemiMajorAxis != 0) - { - // The gravity doesnt have an affect on position so we put whatever - var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, 1f, 100f); - var kepler = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); - pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; - } - - Logger.Log($"Position : {pos}"); - return pos; - } - public static Vector3 GetPosition(ParameterizedAstroObject ao) { Vector3 pos = Vector3.zero; @@ -53,52 +38,26 @@ namespace NewHorizons.OrbitalPhysics return pos; } - public static Vector3 GetPositionFromTrueAnomaly(float eccentricity, float semiMajorAxis, float inclination, float argumentOfPeriapsis, float longitudeOfAscendingNode, float trueAnomaly) - { - Vector3 pos = Vector3.zero; - if (semiMajorAxis != 0) - { - var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, 1f, 100f); - var kepler = KeplerCoordinates.fromTrueAnomaly(eccentricity, semiMajorAxis, inclination, argumentOfPeriapsis, longitudeOfAscendingNode, trueAnomaly); - pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; - } - - Logger.Log($"Position : {pos}"); - return pos; - } - - public static Vector3 GetPositionFromEccentricAnomaly(float eccentricity, float semiMajorAxis, float inclination, float argumentOfPeriapsis, float longitudeOfAscendingNode, float eccentricAnomaly) - { - Vector3 pos = Vector3.zero; - if (semiMajorAxis != 0) - { - var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, 1f, 100f); - var kepler = KeplerCoordinates.fromEccentricAnomaly(eccentricity, semiMajorAxis, inclination, argumentOfPeriapsis, longitudeOfAscendingNode, eccentricAnomaly); - pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1; - } - - Logger.Log($"Position : {pos}"); - return pos; - } - - public static Vector3 GetVelocity(Gravity gravity, OrbitModule orbit) - { + public static Tuple GetCartesian(Gravity gravity, OrbitModule orbit) + { var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, gravity.Exponent, gravity.Mass); var kepler = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); - var vel = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item2; - Logger.Log($"Velocity : {vel}"); - return vel; - } - - public static Vector3 GetVelocity(Gravity gravity, ParameterizedAstroObject ao) + var cartesian = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler); + + Logger.Log($"Position : {cartesian.Item1} Velocity : {cartesian.Item2}"); + return cartesian; + } + + public static Tuple GetCartesian(Gravity gravity, ParameterizedAstroObject ao) { var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, gravity.Exponent, gravity.Mass); var kepler = KeplerCoordinates.fromTrueAnomaly(ao.Eccentricity, ao.SemiMajorAxis, ao.Inclination, ao.ArgumentOfPeriapsis, ao.LongitudeOfAscendingNode, ao.TrueAnomaly); - var vel = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item2; - Logger.Log($"Velocity : {vel}"); - return vel; - } - + var cartesian = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler); + + Logger.Log($"Position : {cartesian.Item1} Velocity : {cartesian.Item2}"); + return cartesian; + } + public static KeplerCoordinates KeplerCoordinatesFromOrbitModule(OrbitModule orbit) { return KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly); diff --git a/NewHorizons/OrbitalPhysics/ParameterizedOrbitLine.cs b/NewHorizons/OrbitalPhysics/ParameterizedOrbitLine.cs index 4aa4ba29..b17b0d70 100644 --- a/NewHorizons/OrbitalPhysics/ParameterizedOrbitLine.cs +++ b/NewHorizons/OrbitalPhysics/ParameterizedOrbitLine.cs @@ -18,44 +18,6 @@ namespace NewHorizons.OrbitalPhysics public override void Start() { base.Start(); - - astroObject = _astroObject as ParameterizedAstroObject; - - var periapsis = OrbitalHelper.GetPositionFromEccentricAnomaly(astroObject.Eccentricity, astroObject.SemiMajorAxis, astroObject.Inclination, astroObject.ArgumentOfPeriapsis, astroObject.LongitudeOfAscendingNode, 0f); - var semiMinorDecending = OrbitalHelper.GetPositionFromEccentricAnomaly(astroObject.Eccentricity, astroObject.SemiMajorAxis, astroObject.Inclination, astroObject.ArgumentOfPeriapsis, astroObject.LongitudeOfAscendingNode, 90f); - var a = astroObject.SemiMajorAxis; - var b = a * Mathf.Sqrt(1 - astroObject.Eccentricity * astroObject.Eccentricity); - - _semiMajorAxis = periapsis.normalized * a; - _semiMinorAxis = semiMinorDecending.normalized * b; - _upAxisDir = Vector3.Cross(_semiMajorAxis, _semiMinorAxis).normalized; - _fociDistance = Mathf.Sqrt(a * a - b * b); } - - // Literally the stock EllipticOrbitLine but for now I don't want to use the patches from CommonResources - public override void Update() - { - AstroObject primaryAO = _astroObject?.GetPrimaryBody(); - if (primaryAO == null) - { - base.enabled = false; - return; - } - Vector3 vector = primaryAO.transform.position + this._semiMajorAxis.normalized * this._fociDistance; - float num = this.CalcProjectedAngleToCenter(vector, this._semiMajorAxis, this._semiMinorAxis, this._astroObject.transform.position); - for (int i = 0; i < this._numVerts; i++) - { - float f = (float)i / (float)(this._numVerts - 1) * 3.1415927f * 2f - (num + 3.1415927f); - this._verts[i] = this._semiMajorAxis * Mathf.Cos(f) + this._semiMinorAxis * Mathf.Sin(f); - } - this._lineRenderer.SetPositions(this._verts); - base.transform.position = vector; - base.transform.rotation = Quaternion.LookRotation(this._semiMinorAxis, this._upAxisDir); - float num2 = this.DistanceToEllipticalOrbitLine(vector, this._semiMajorAxis, this._semiMinorAxis, this._upAxisDir, Locator.GetActiveCamera().transform.position); - float widthMultiplier = Mathf.Min(num2 * (this._lineWidth / 1000f), this._maxLineWidth); - float num3 = this._fade ? (1f - Mathf.Clamp01((num2 - this._fadeStartDist) / (this._fadeEndDist - this._fadeStartDist))) : 1f; - this._lineRenderer.widthMultiplier = widthMultiplier; - this._lineRenderer.startColor = new Color(this._color.r, this._color.g, this._color.b, num3 * num3); - } } }