Still broken

This commit is contained in:
Nick J. Connors 2021-12-28 17:29:51 -05:00
parent 4e6b6c4768
commit 2af194672e
9 changed files with 105 additions and 55 deletions

View File

@ -159,11 +159,11 @@ namespace NewHorizons.Builder.General
var focalPointVelocity = focalPointMotion == null ? Vector3.zero : focalPointMotion.GetInitVelocity();
var primaryInitialMotion = primary.gameObject.GetComponent<InitialMotion>();
primaryInitialMotion.SetValue("_initLinearDirection", v1.normalized);
primaryInitialMotion.SetValue("_initLinearDirection", primary.gameObject.transform.InverseTransformDirection(v1.normalized));
primaryInitialMotion.SetValue("_initLinearSpeed", v1.magnitude);
var secondaryInitialMotion = secondary.gameObject.GetComponent<InitialMotion>();
secondaryInitialMotion.SetValue("_initLinearDirection", v2.normalized);
secondaryInitialMotion.SetValue("_initLinearDirection", secondary.gameObject.transform.InverseTransformDirection(v2.normalized));
secondaryInitialMotion.SetValue("_initLinearSpeed", v2.magnitude);
// InitialMotion already set its speed so we overwrite that
@ -178,10 +178,7 @@ namespace NewHorizons.Builder.General
// If they have tracking orbits set the period
var period = 2 * Mathf.PI * Mathf.Sqrt(Mathf.Pow(r, exponent + 1) / (GravityVolume.GRAVITATIONAL_CONSTANT * totalMass));
if (exponent == 1) period /= 3f;
// Only one of these won't be null, the other one gets done next tick
var trackingOrbitPrimary = primary.GetComponentInChildren<TrackingOrbitLine>();
if (trackingOrbitPrimary != null)
{

View File

@ -8,7 +8,7 @@ namespace NewHorizons.Builder.General
{
static class GravityBuilder
{
public static void Make(GameObject body, AstroObject ao, float surfaceAccel, float sphereOfInfluence, float surface, string falloffType)
public static GravityVolume Make(GameObject body, AstroObject ao, float surfaceAccel, float sphereOfInfluence, float surface, string falloffType)
{
GameObject gravityGO = new GameObject("GravityWell");
gravityGO.transform.parent = body.transform;
@ -42,6 +42,8 @@ namespace NewHorizons.Builder.General
gravityGO.SetActive(true);
ao.SetValue("_gravityVolume", GV);
return GV;
}
}
}

View File

@ -0,0 +1,32 @@
using NewHorizons.External;
using NewHorizons.OrbitalPhysics;
using NewHorizons.Utility;
using PacificEngine.OW_CommonResources.Game.Resource;
using PacificEngine.OW_CommonResources.Game.State;
using PacificEngine.OW_CommonResources.Geometry.Orbits;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace NewHorizons.Builder.General
{
public static class HeavenlyBodyBuilder
{
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 = new Gravity(G, bodyGravity == null ? 0 : bodyGravity.GetFalloffExponent(), bodyGravity == null ? 0 : bodyGravity.GetStandardGravitationalParameter() / G);
var parent = HeavenlyBody.FromString(config.Orbit.PrimaryBody);
var orbit = OrbitalHelper.KeplerCoordinatesFromOrbitModule(config.Orbit);
var hb = new HeavenlyBody(config.Name);
var planetoid = new Planet.Plantoid(size, gravity, body.transform.rotation, initialMotion._initAngularSpeed, parent, orbit);
Planet.mapping.Add(hb, planetoid);
}
}
}

View File

@ -17,31 +17,21 @@ namespace NewHorizons.Builder.Orbital
{
public static InitialMotion Make(GameObject body, AstroObject primaryBody, OWRigidbody OWRB, OrbitModule orbit)
{
/*
ParameterizedInitialMotion initialMotion = body.AddComponent<ParameterizedInitialMotion>();
initialMotion.SetPrimary(primaryBody);
initialMotion.SetOrbitalParameters(
orbit.Eccentricity,
orbit.SemiMajorAxis,
orbit.Inclination,
orbit.LongitudeOfAscendingNode,
orbit.ArgumentOfPeriapsis,
orbit.TrueAnomaly);
initialMotion.SetValue("_initAngularSpeed", orbit.SiderealPeriod == 0 ? 0.02f : 1.0f / orbit.SiderealPeriod);
*/
InitialMotion initialMotion = body.AddComponent<InitialMotion>();
return Update(initialMotion, body, primaryBody, OWRB, orbit);
}
public static InitialMotion Update(InitialMotion initialMotion, GameObject body, AstroObject primaryBody, OWRigidbody OWRB, OrbitModule orbit)
{
// Rotation
initialMotion.SetValue("_initAngularSpeed", orbit.SiderealPeriod == 0 ? 0f : 1.0f / orbit.SiderealPeriod);
var rotationAxis = Quaternion.AngleAxis(orbit.AxialTilt + orbit.Inclination, Vector3.right) * Vector3.up;
body.transform.rotation = Quaternion.FromToRotation(Vector3.up, rotationAxis);
initialMotion._orbitImpulseScalar = 0f;
if (!orbit.IsStatic)
{
initialMotion._orbitImpulseScalar = 0f;
{
if(primaryBody != null)
{
initialMotion.SetPrimaryBody(primaryBody.GetAttachedOWRigidbody());
@ -49,18 +39,14 @@ namespace NewHorizons.Builder.Orbital
if(gv != null)
{
var velocity = OrbitalHelper.GetVelocity(new OrbitalHelper.Gravity(primaryBody.GetGravityVolume()), orbit);
initialMotion._initLinearDirection = velocity.normalized;
// 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);
initialMotion._initLinearSpeed = velocity.magnitude;
}
}
}
// Rotation
//initialMotion.SetValue("_initAngularSpeed", orbit.SiderealPeriod == 0 ? 0f : 1.0f / orbit.SiderealPeriod);
initialMotion.SetValue("_initAngularSpeed", 0);
var rotationAxis = Quaternion.AngleAxis(orbit.AxialTilt + orbit.Inclination, Vector3.right) * Vector3.up;
body.transform.rotation = Quaternion.FromToRotation(Vector3.up, rotationAxis);
return initialMotion;
}
}

View File

@ -21,15 +21,12 @@ namespace NewHorizons.Builder.Orbital
lineRenderer.useWorldSpace = false;
lineRenderer.loop = false;
var ecc = config.Orbit.Eccentricity;
OrbitLine orbitLine;
if (config.Orbit.Eccentricity == 0)
{
orbitLine = orbitGO.AddComponent<ParameterizedOrbitLine>();
}
else
{
orbitLine = orbitGO.AddComponent<TrackingOrbitLine>();
}
if (ecc == 0) orbitLine = orbitGO.AddComponent<OrbitLine>();
else if (ecc > 0 && ecc < 1) orbitLine = orbitGO.AddComponent<EllipticOrbitLine>();
else orbitLine = orbitGO.AddComponent<TrackingOrbitLine>();
var color = Color.white;
if (config.Orbit.Tint != null) color = config.Orbit.Tint.ToColor32();

View File

@ -10,6 +10,9 @@ using NewHorizons.Utility;
using OWML.Common;
using OWML.ModHelper;
using OWML.Utils;
using PacificEngine.OW_CommonResources.Game.Resource;
using PacificEngine.OW_CommonResources.Game.State;
using PacificEngine.OW_CommonResources.Geometry.Orbits;
using System;
using System.Collections.Generic;
using System.IO;
@ -17,6 +20,7 @@ using System.Linq;
using System.Reflection;
using UnityEngine;
using UnityEngine.SceneManagement;
using static PacificEngine.OW_CommonResources.Game.State.Planet;
using Logger = NewHorizons.Utility.Logger;
namespace NewHorizons
@ -219,8 +223,6 @@ namespace NewHorizons
Logger.Log($"Begin generation sequence of [{body.Config.Name}]");
body.Config.Orbit.AxialTilt = 0;
var go = new GameObject(body.Config.Name.Replace(" ", "").Replace("'", "") + "_Body");
go.SetActive(false);
@ -233,8 +235,9 @@ namespace NewHorizons
var ao = (AstroObject)outputTuple.Item1;
var owRigidBody = (OWRigidbody)outputTuple.Item2;
GravityVolume gv = null;
if (body.Config.Base.SurfaceGravity != 0)
GravityBuilder.Make(go, ao, body.Config.Base.SurfaceGravity, sphereOfInfluence * (body.Config.Star != null ? 10f : 1f), body.Config.Base.SurfaceSize, body.Config.Base.GravityFallOff);
gv = GravityBuilder.Make(go, ao, body.Config.Base.SurfaceGravity, sphereOfInfluence * (body.Config.Star != null ? 10f : 1f), body.Config.Base.SurfaceSize, body.Config.Base.GravityFallOff);
if(body.Config.Base.HasReferenceFrame)
RFVolumeBuilder.Make(go, owRigidBody, sphereOfInfluence);
@ -280,7 +283,7 @@ namespace NewHorizons
}
// Have to do this after setting position
InitialMotionBuilder.Make(go, primaryBody, owRigidBody, body.Config.Orbit);
var initialMotion = InitialMotionBuilder.Make(go, primaryBody, owRigidBody, body.Config.Orbit);
// Spawning on other planets is a bit hacky so we do it last
if (body.Config.Spawn != null)
@ -294,6 +297,8 @@ namespace NewHorizons
if (ao.GetAstroObjectName() == AstroObject.Name.CustomString) AstroObjectLocator.RegisterCustomAstroObject(ao);
HeavenlyBodyBuilder.Make(go, body.Config, sphereOfInfluence, gv, initialMotion);
return go;
}

View File

@ -31,7 +31,7 @@ namespace NewHorizons.OrbitalPhysics
{
// 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 + 90, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly);
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;
}
@ -45,7 +45,7 @@ namespace NewHorizons.OrbitalPhysics
if(ao.SemiMajorAxis != 0)
{
var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, 1f, 100f);
var kepler = KeplerCoordinates.fromTrueAnomaly(ao.Eccentricity, ao.SemiMajorAxis, ao.Inclination + 90, ao.ArgumentOfPeriapsis, ao.LongitudeOfAscendingNode, ao.TrueAnomaly);
var kepler = KeplerCoordinates.fromTrueAnomaly(ao.Eccentricity, ao.SemiMajorAxis, ao.Inclination, ao.ArgumentOfPeriapsis, ao.LongitudeOfAscendingNode, ao.TrueAnomaly);
pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1;
}
@ -59,7 +59,7 @@ namespace NewHorizons.OrbitalPhysics
if (semiMajorAxis != 0)
{
var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, 1f, 100f);
var kepler = KeplerCoordinates.fromTrueAnomaly(eccentricity, semiMajorAxis, inclination + 90, argumentOfPeriapsis, longitudeOfAscendingNode, trueAnomaly);
var kepler = KeplerCoordinates.fromTrueAnomaly(eccentricity, semiMajorAxis, inclination, argumentOfPeriapsis, longitudeOfAscendingNode, trueAnomaly);
pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1;
}
@ -73,7 +73,7 @@ namespace NewHorizons.OrbitalPhysics
if (semiMajorAxis != 0)
{
var crGravity = new CRGravity(GravityVolume.GRAVITATIONAL_CONSTANT, 1f, 100f);
var kepler = KeplerCoordinates.fromEccentricAnomaly(eccentricity, semiMajorAxis, inclination + 90, argumentOfPeriapsis, longitudeOfAscendingNode, eccentricAnomaly);
var kepler = KeplerCoordinates.fromEccentricAnomaly(eccentricity, semiMajorAxis, inclination, argumentOfPeriapsis, longitudeOfAscendingNode, eccentricAnomaly);
pos = PacificEngine.OW_CommonResources.Geometry.Orbits.OrbitHelper.toCartesian(crGravity, 0f, kepler).Item1;
}
@ -84,7 +84,7 @@ namespace NewHorizons.OrbitalPhysics
public static Vector3 GetVelocity(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 + 90, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly);
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;
@ -93,12 +93,17 @@ namespace NewHorizons.OrbitalPhysics
public static Vector3 GetVelocity(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 + 90, ao.ArgumentOfPeriapsis, ao.LongitudeOfAscendingNode, ao.TrueAnomaly);
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;
}
public static KeplerCoordinates KeplerCoordinatesFromOrbitModule(OrbitModule orbit)
{
return KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly);
}
public class Gravity
{
public float Exponent { get; }

View File

@ -24,7 +24,7 @@ namespace NewHorizons.OrbitalPhysics
public float Inclination
{
get { return _keplerCoordinates.inclinationAngle - 90; }
get { return _keplerCoordinates.inclinationAngle; }
}
public float ArgumentOfPeriapsis
@ -44,12 +44,12 @@ namespace NewHorizons.OrbitalPhysics
public void SetKeplerCoordinatesFromOrbitModule(OrbitModule orbit)
{
_keplerCoordinates = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination + 90, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly);
_keplerCoordinates = KeplerCoordinates.fromTrueAnomaly(orbit.Eccentricity, orbit.SemiMajorAxis, orbit.Inclination, orbit.ArgumentOfPeriapsis, orbit.LongitudeOfAscendingNode, orbit.TrueAnomaly);
}
public void SetKeplerCoordinatesFromTrueAnomaly(float ecc, float a, float i, float p, float l, float trueAnomaly)
{
_keplerCoordinates = KeplerCoordinates.fromTrueAnomaly(ecc, a, i + 90, p, l, trueAnomaly);
_keplerCoordinates = KeplerCoordinates.fromTrueAnomaly(ecc, a, i, p, l, trueAnomaly);
}
public override string ToString()

View File

@ -21,8 +21,8 @@ namespace NewHorizons.OrbitalPhysics
astroObject = _astroObject as ParameterizedAstroObject;
var periapsis = OrbitalHelper.GetPositionFromEccentricAnomaly(astroObject.Eccentricity, astroObject.SemiMajorAxis, astroObject.Inclination + 90, astroObject.ArgumentOfPeriapsis, astroObject.LongitudeOfAscendingNode, 0f);
var semiMinorDecending = OrbitalHelper.GetPositionFromEccentricAnomaly(astroObject.Eccentricity, astroObject.SemiMajorAxis, astroObject.Inclination + 90, astroObject.ArgumentOfPeriapsis, astroObject.LongitudeOfAscendingNode, 90f);
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);
@ -31,5 +31,31 @@ namespace NewHorizons.OrbitalPhysics
_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 astroObject = (this._astroObject != null) ? this._astroObject.GetPrimaryBody() : null;
if (astroObject == null)
{
base.enabled = false;
return;
}
Vector3 vector = astroObject.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);
}
}
}