OrbitSystem -> Barycenter
This commit is contained in:
parent
5ad70b3f9c
commit
70c4cd8a92
|
@ -0,0 +1,18 @@
|
||||||
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://scripts/orbits/Barycenter.cs" type="Script" id=1]
|
||||||
|
[ext_resource path="res://scenes/orbits/Planet.tscn" type="PackedScene" id=2]
|
||||||
|
|
||||||
|
[node name="Barycenter" type="Spatial"]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
SemiMajorAxis = 7.0
|
||||||
|
Eccentricity = 0.752
|
||||||
|
_pointMassPaths = [ NodePath("Planet A"), NodePath("Planet B") ]
|
||||||
|
_speed = 1.0
|
||||||
|
|
||||||
|
[node name="Planet A" parent="." instance=ExtResource( 2 )]
|
||||||
|
transform = Transform( 0.999977, 0.00603502, 0.00319089, -0.00604282, 0.999979, 0.0024369, -0.00317609, -0.00245615, 0.999992, -2.55711, 0, -4.25519 )
|
||||||
|
|
||||||
|
[node name="Planet B" parent="." instance=ExtResource( 2 )]
|
||||||
|
transform = Transform( 0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, -11.9998, 0, 1.25565 )
|
||||||
|
Mass = 0.125
|
|
@ -1,22 +0,0 @@
|
||||||
[gd_scene load_steps=3 format=2]
|
|
||||||
|
|
||||||
[ext_resource path="res://scripts/orbits/OrbitSystem.cs" type="Script" id=1]
|
|
||||||
[ext_resource path="res://scenes/orbits/Planet.tscn" type="PackedScene" id=2]
|
|
||||||
|
|
||||||
[node name="Orbit System" type="Spatial"]
|
|
||||||
script = ExtResource( 1 )
|
|
||||||
SemiMajorAxis = 6.881
|
|
||||||
Eccentricity = 0.399
|
|
||||||
Period = 10.0
|
|
||||||
_a = NodePath("Planet A")
|
|
||||||
_b = NodePath("Planet B")
|
|
||||||
_barycenter = NodePath("Barycenter")
|
|
||||||
|
|
||||||
[node name="Barycenter" type="Spatial" parent="."]
|
|
||||||
|
|
||||||
[node name="Planet A" parent="." instance=ExtResource( 2 )]
|
|
||||||
transform = Transform( 0.999977, 0.00603502, 0.00319089, -0.00604282, 0.999979, 0.0024369, -0.00317609, -0.00245615, 0.999992, 0, 0, 0 )
|
|
||||||
|
|
||||||
[node name="Planet B" parent="." instance=ExtResource( 2 )]
|
|
||||||
transform = Transform( 0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, -8.44634, 0, -3.53339 )
|
|
||||||
Mass = 0.125
|
|
|
@ -1,13 +1,13 @@
|
||||||
using Godot;
|
using Godot;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using Vim.Math3d;
|
using Vim.Math3d;
|
||||||
|
|
||||||
[Tool]
|
[Tool]
|
||||||
public class OrbitSystem : Node, IMassive, ILocation
|
public class Barycenter : Node, IPointMass
|
||||||
{
|
{
|
||||||
[Export] private NodePath _a;
|
[Export]
|
||||||
[Export] private NodePath _b;
|
private NodePath[] _pointMassPaths;
|
||||||
[Export] private NodePath _barycenter;
|
|
||||||
|
|
||||||
private double _semiMajorAxis;
|
private double _semiMajorAxis;
|
||||||
[Export]
|
[Export]
|
||||||
|
@ -40,79 +40,19 @@ public class OrbitSystem : Node, IMassive, ILocation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Point Masses
|
public double Mass
|
||||||
private IPointMass Primary
|
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (_pointMasses[0] == null)
|
double mass = 0;
|
||||||
|
foreach (var orbiter in Orbiters)
|
||||||
{
|
{
|
||||||
InitPointMasses();
|
mass += orbiter.PointMass.Mass;
|
||||||
}
|
}
|
||||||
return _pointMasses[0];
|
return mass;
|
||||||
}
|
|
||||||
}
|
|
||||||
private IPointMass Secondary
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (_pointMasses[1] == null)
|
|
||||||
{
|
|
||||||
InitPointMasses();
|
|
||||||
}
|
|
||||||
return _pointMasses[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private readonly IPointMass[] _pointMasses = new IPointMass[2];
|
|
||||||
private void InitPointMasses()
|
|
||||||
{
|
|
||||||
var a = GetNode<IPointMass>(_a);
|
|
||||||
var b = GetNode<IPointMass>(_b);
|
|
||||||
|
|
||||||
if (a.Mass > b.Mass)
|
|
||||||
{
|
|
||||||
_pointMasses[0] = a;
|
|
||||||
_pointMasses[1] = b;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_pointMasses[0] = b;
|
|
||||||
_pointMasses[1] = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
public float Mass => Primary.Mass + Secondary.Mass;
|
|
||||||
public DVector3 Position
|
|
||||||
{
|
|
||||||
get => Barycenter;
|
|
||||||
set => Barycenter = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DVector3 Barycenter
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
var p0 = Primary.Position;
|
|
||||||
var p1 = Secondary.Position;
|
|
||||||
return p0.Lerp(p1, .5f);
|
|
||||||
}
|
|
||||||
// TODO - make setting the berycenter do something sensible?
|
|
||||||
set => _ = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Orbit _orbit = null;
|
|
||||||
private Orbit Orbit
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (_orbit == null)
|
|
||||||
{
|
|
||||||
_orbit = new Orbit();
|
|
||||||
}
|
|
||||||
return _orbit;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public DVector3 Position { get; set; }
|
||||||
|
|
||||||
private ImmediateGeometry _orbitGeometry = null;
|
private ImmediateGeometry _orbitGeometry = null;
|
||||||
public ImmediateGeometry OrbitGeometry
|
public ImmediateGeometry OrbitGeometry
|
||||||
|
@ -132,6 +72,50 @@ public class OrbitSystem : Node, IMassive, ILocation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private struct Orbiter
|
||||||
|
{
|
||||||
|
public IPointMass PointMass { get; set; }
|
||||||
|
public IOrbit Orbit { get; set; }
|
||||||
|
}
|
||||||
|
private Orbiter[] _orbiters = null;
|
||||||
|
private Orbiter[] Orbiters
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_orbiters == null)
|
||||||
|
{
|
||||||
|
var length = _pointMassPaths.Length;
|
||||||
|
_orbiters = new Orbiter[length];
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
var pointMass = GetNode<IPointMass>(_pointMassPaths[i]);
|
||||||
|
var orbit = new Orbit(this, pointMass);
|
||||||
|
|
||||||
|
var orbiter = new Orbiter
|
||||||
|
{
|
||||||
|
PointMass = pointMass,
|
||||||
|
Orbit = orbit
|
||||||
|
};
|
||||||
|
_orbiters[i] = orbiter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _orbiters;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IOrbit[] _orbits;
|
||||||
|
private IOrbit[] Orbits
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_orbits == null)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
return _orbits;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private float _time = 0;
|
private float _time = 0;
|
||||||
|
|
||||||
[Export]
|
[Export]
|
||||||
|
@ -145,9 +129,15 @@ public class OrbitSystem : Node, IMassive, ILocation
|
||||||
|
|
||||||
private void InvalidateGeometry()
|
private void InvalidateGeometry()
|
||||||
{
|
{
|
||||||
Orbit.Ellipse = new Ellipse(SemiMajorAxis, Eccentricity);
|
for (int i = 0; i < Orbiters.Length; i++)
|
||||||
Orbit.Draw(OrbitGeometry);
|
{
|
||||||
|
var orbiter = Orbiters[i];
|
||||||
|
var orbit = orbiter.Orbit;
|
||||||
|
orbit.Ellipse = new Ellipse(SemiMajorAxis, Eccentricity);
|
||||||
|
orbit.Draw(OrbitGeometry);
|
||||||
|
|
||||||
Secondary.Position = Orbit.GetPosition(_time);
|
var t = _time + i * Math.PI;
|
||||||
|
orbiter.PointMass.Position = orbit.GetPosition(t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue