mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Make quantum planet orbit line update between states (#134)
This commit is contained in:
parent
d25de13914
commit
ab47789c5d
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user