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>();
var a = astroObject.semiMajorAxis;
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);
(orbitLine as NHOrbitLine).SetFromParameters(astroObject);
}
var color = Color.white;

View File

@ -1,20 +1,17 @@
using System;
using System;
using UnityEngine;
using Logger = NewHorizons.Utility.Logger;
namespace NewHorizons.Components.Orbital
{
public class NHOrbitLine : OrbitLine
{
public Vector3 SemiMajorAxis { get; set; }
public Vector3 SemiMinorAxis { get; set; }
private Vector3 _semiMajorAxis;
private Vector3 _semiMinorAxis;
private Vector3 _upAxis;
private float _fociDistance;
private Vector3[] _verts;
private float semiMajorAxis;
private float semiMinorAxis;
public override void InitializeLineRenderer()
{
base.GetComponent<LineRenderer>().positionCount = this._numVerts;
@ -36,10 +33,10 @@ namespace NewHorizons.Components.Orbital
{
base.Start();
var a = SemiMajorAxis.magnitude;
var b = SemiMinorAxis.magnitude;
var a = _semiMajorAxis.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);
if (float.IsNaN(_fociDistance)) _fociDistance = 0f;
@ -48,9 +45,6 @@ namespace NewHorizons.Components.Orbital
transform.localRotation = Quaternion.Euler(270, 90, 0);
semiMajorAxis = SemiMajorAxis.magnitude;
semiMinorAxis = SemiMinorAxis.magnitude;
base.enabled = false;
}
@ -67,22 +61,22 @@ namespace NewHorizons.Components.Orbital
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++)
{
var stepSize = 2f * Mathf.PI / (float)(_numVerts - 1);
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);
transform.position = origin;
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 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)
{
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)
{
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);
}
}

View File

@ -20,6 +20,7 @@ namespace NewHorizons.Components
private ConstantForceDetector _detector;
private AlignWithTargetBody _alignment;
private OWRigidbody _rb;
private OrbitLine _orbitLine;
public int CurrentIndex { get { return _currentIndex; } }
@ -31,6 +32,7 @@ namespace NewHorizons.Components
_detector = GetComponentInChildren<ConstantForceDetector>();
_alignment = GetComponent<AlignWithTargetBody>();
_rb = GetComponent<OWRigidbody>();
_orbitLine = GetComponent<OrbitLine>();
GlobalMessenger.AddListener("PlayerBlink", new Callback(OnPlayerBlink));
@ -143,6 +145,16 @@ namespace NewHorizons.Components
}
_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()