Make quantum planet orbit line update between states (#134)

This commit is contained in:
Nick 2022-06-13 20:42:54 -04:00
parent d25de13914
commit ab47789c5d
3 changed files with 37 additions and 26 deletions

View File

@ -45,15 +45,7 @@ namespace NewHorizons.Builder.Orbital
{ {
orbitLine = orbitGO.AddComponent<NHOrbitLine>(); orbitLine = orbitGO.AddComponent<NHOrbitLine>();
var a = astroObject.semiMajorAxis; (orbitLine as NHOrbitLine).SetFromParameters(astroObject);
var e = astroObject.eccentricity;
var b = a * Mathf.Sqrt(1f - (e * e));
var l = astroObject.longitudeOfAscendingNode;
var p = astroObject.argumentOfPeriapsis;
var i = astroObject.inclination;
(orbitLine as NHOrbitLine).SemiMajorAxis = a * OrbitalParameters.Rotate(Vector3.left, l, i, p);
(orbitLine as NHOrbitLine).SemiMinorAxis = b * OrbitalParameters.Rotate(Vector3.forward, l, i, p);
} }
var color = Color.white; var color = Color.white;

View File

@ -1,20 +1,17 @@
using System; using System;
using UnityEngine; using UnityEngine;
using Logger = NewHorizons.Utility.Logger; using Logger = NewHorizons.Utility.Logger;
namespace NewHorizons.Components.Orbital namespace NewHorizons.Components.Orbital
{ {
public class NHOrbitLine : OrbitLine public class NHOrbitLine : OrbitLine
{ {
public Vector3 SemiMajorAxis { get; set; } private Vector3 _semiMajorAxis;
public Vector3 SemiMinorAxis { get; set; } private Vector3 _semiMinorAxis;
private Vector3 _upAxis; private Vector3 _upAxis;
private float _fociDistance; private float _fociDistance;
private Vector3[] _verts; private Vector3[] _verts;
private float semiMajorAxis;
private float semiMinorAxis;
public override void InitializeLineRenderer() public override void InitializeLineRenderer()
{ {
base.GetComponent<LineRenderer>().positionCount = this._numVerts; base.GetComponent<LineRenderer>().positionCount = this._numVerts;
@ -36,10 +33,10 @@ namespace NewHorizons.Components.Orbital
{ {
base.Start(); base.Start();
var a = SemiMajorAxis.magnitude; var a = _semiMajorAxis.magnitude;
var b = SemiMinorAxis.magnitude; var b = _semiMinorAxis.magnitude;
_upAxis = Vector3.Cross(SemiMajorAxis.normalized, SemiMinorAxis.normalized); _upAxis = Vector3.Cross(_semiMajorAxis.normalized, _semiMinorAxis.normalized);
_fociDistance = Mathf.Sqrt(a * a - b * b); _fociDistance = Mathf.Sqrt(a * a - b * b);
if (float.IsNaN(_fociDistance)) _fociDistance = 0f; if (float.IsNaN(_fociDistance)) _fociDistance = 0f;
@ -48,9 +45,6 @@ namespace NewHorizons.Components.Orbital
transform.localRotation = Quaternion.Euler(270, 90, 0); transform.localRotation = Quaternion.Euler(270, 90, 0);
semiMajorAxis = SemiMajorAxis.magnitude;
semiMinorAxis = SemiMinorAxis.magnitude;
base.enabled = false; base.enabled = false;
} }
@ -67,22 +61,22 @@ namespace NewHorizons.Components.Orbital
return; return;
} }
Vector3 origin = primary.transform.position + SemiMajorAxis.normalized * _fociDistance; Vector3 origin = primary.transform.position + _semiMajorAxis.normalized * _fociDistance;
float num = CalcProjectedAngleToCenter(origin, SemiMajorAxis, SemiMinorAxis, _astroObject.transform.position); float num = CalcProjectedAngleToCenter(origin, _semiMajorAxis, _semiMinorAxis, _astroObject.transform.position);
for (int i = 0; i < _numVerts; i++) for (int i = 0; i < _numVerts; i++)
{ {
var stepSize = 2f * Mathf.PI / (float)(_numVerts - 1); var stepSize = 2f * Mathf.PI / (float)(_numVerts - 1);
float f = num + stepSize * i; float f = num + stepSize * i;
_verts[i] = SemiMajorAxis * Mathf.Cos(f) + SemiMinorAxis * Mathf.Sin(f); _verts[i] = _semiMajorAxis * Mathf.Cos(f) + _semiMinorAxis * Mathf.Sin(f);
} }
_lineRenderer.SetPositions(_verts); _lineRenderer.SetPositions(_verts);
transform.position = origin; transform.position = origin;
transform.rotation = Quaternion.Euler(0, 0, 0); //Quaternion.LookRotation(-SemiMajorAxis, _upAxis); transform.rotation = Quaternion.Euler(0, 0, 0); //Quaternion.LookRotation(-SemiMajorAxis, _upAxis);
float num2 = DistanceToEllipticalOrbitLine(origin, SemiMajorAxis, SemiMinorAxis, _upAxis, Locator.GetActiveCamera().transform.position); float num2 = DistanceToEllipticalOrbitLine(origin, _semiMajorAxis, _semiMinorAxis, _upAxis, Locator.GetActiveCamera().transform.position);
float widthMultiplier = Mathf.Min(num2 * (_lineWidth / 1000f), _maxLineWidth); float widthMultiplier = Mathf.Min(num2 * (_lineWidth / 1000f), _maxLineWidth);
float num3 = _fade ? (1f - Mathf.Clamp01((num2 - _fadeStartDist) / (_fadeEndDist - _fadeStartDist))) : 1f; float num3 = _fade ? (1f - Mathf.Clamp01((num2 - _fadeStartDist) / (_fadeEndDist - _fadeStartDist))) : 1f;
@ -96,6 +90,19 @@ namespace NewHorizons.Components.Orbital
} }
} }
public void SetFromParameters(IOrbitalParameters parameters)
{
var a = parameters.semiMajorAxis;
var e = parameters.eccentricity;
var b = a * Mathf.Sqrt(1f - (e * e));
var l = parameters.longitudeOfAscendingNode;
var p = parameters.argumentOfPeriapsis;
var i = parameters.inclination;
_semiMajorAxis = a * OrbitalParameters.Rotate(Vector3.left, l, i, p);
_semiMinorAxis = b * OrbitalParameters.Rotate(Vector3.forward, l, i, p);
}
private float CalcProjectedAngleToCenter(Vector3 foci, Vector3 semiMajorAxis, Vector3 semiMinorAxis, Vector3 point) private float CalcProjectedAngleToCenter(Vector3 foci, Vector3 semiMajorAxis, Vector3 semiMinorAxis, Vector3 point)
{ {
Vector3 lhs = point - foci; Vector3 lhs = point - foci;
@ -107,7 +114,7 @@ namespace NewHorizons.Components.Orbital
private float DistanceToEllipticalOrbitLine(Vector3 foci, Vector3 semiMajorAxis, Vector3 semiMinorAxis, Vector3 upAxis, Vector3 point) private float DistanceToEllipticalOrbitLine(Vector3 foci, Vector3 semiMajorAxis, Vector3 semiMinorAxis, Vector3 upAxis, Vector3 point)
{ {
float f = CalcProjectedAngleToCenter(foci, semiMajorAxis, semiMinorAxis, point); float f = CalcProjectedAngleToCenter(foci, semiMajorAxis, semiMinorAxis, point);
Vector3 b = foci + SemiMajorAxis * Mathf.Cos(f) + SemiMinorAxis * Mathf.Sin(f); Vector3 b = foci + _semiMajorAxis * Mathf.Cos(f) + _semiMinorAxis * Mathf.Sin(f);
return Vector3.Distance(point, b); return Vector3.Distance(point, b);
} }
} }

View File

@ -20,6 +20,7 @@ namespace NewHorizons.Components
private ConstantForceDetector _detector; private ConstantForceDetector _detector;
private AlignWithTargetBody _alignment; private AlignWithTargetBody _alignment;
private OWRigidbody _rb; private OWRigidbody _rb;
private OrbitLine _orbitLine;
public int CurrentIndex { get { return _currentIndex; } } public int CurrentIndex { get { return _currentIndex; } }
@ -31,6 +32,7 @@ namespace NewHorizons.Components
_detector = GetComponentInChildren<ConstantForceDetector>(); _detector = GetComponentInChildren<ConstantForceDetector>();
_alignment = GetComponent<AlignWithTargetBody>(); _alignment = GetComponent<AlignWithTargetBody>();
_rb = GetComponent<OWRigidbody>(); _rb = GetComponent<OWRigidbody>();
_orbitLine = GetComponent<OrbitLine>();
GlobalMessenger.AddListener("PlayerBlink", new Callback(OnPlayerBlink)); GlobalMessenger.AddListener("PlayerBlink", new Callback(OnPlayerBlink));
@ -143,6 +145,16 @@ namespace NewHorizons.Components
} }
_rb.SetVelocity(orbitalParameters.InitialVelocity + primaryBody.GetAttachedOWRigidbody().GetVelocity()); _rb.SetVelocity(orbitalParameters.InitialVelocity + primaryBody.GetAttachedOWRigidbody().GetVelocity());
if (_orbitLine is NHOrbitLine nhOrbitLine)
{
nhOrbitLine.SetFromParameters(orbitalParameters);
}
if (_orbitLine is TrackingOrbitLine trackingOrbitLine)
{
trackingOrbitLine.Reset();
}
} }
private void OnPlayerBlink() private void OnPlayerBlink()