feat: calculate mean orbital motion from M
This commit is contained in:
parent
8d6138f15e
commit
a570986485
|
@ -24,16 +24,9 @@ public:
|
||||||
void setArgumentOfPeriapsis(double argumentOfPeriapsis);
|
void setArgumentOfPeriapsis(double argumentOfPeriapsis);
|
||||||
void setLongitudeOfAscendingNode(double longitudeOfAscendingNode);
|
void setLongitudeOfAscendingNode(double longitudeOfAscendingNode);
|
||||||
|
|
||||||
// TODO: meanAnomaly in all these arguments actually means ellipticalMeanAnomaly,
|
glm::dvec3 getPosition(double gravitationalParameter, double time) const;
|
||||||
// will have to change that when adding non-ellipctical orbits - don't get confused!
|
glm::dvec3 getPositionFromMeanAnomaly(double meanAnomaly) const;
|
||||||
//
|
//glm::dvec3 getTangent(const double meanAnomaly) const;
|
||||||
// do we actual want to use mean anomaly for this? we could instead pass in time and
|
|
||||||
// the gravitational parameter which are easier numbers to come by, i think? at least,
|
|
||||||
// the mean motion is determined from the mean motion and time time
|
|
||||||
//glm::vec3 getPosition(double gravitationalParameter, double time) const;
|
|
||||||
|
|
||||||
glm::dvec3 getPosition(const double meanAnomaly) const;
|
|
||||||
glm::dvec3 getTangent(const double meanAnomaly) const;
|
|
||||||
//glm::mat4 getLookAlongMatrix(const double meanAnomaly) const;
|
//glm::mat4 getLookAlongMatrix(const double meanAnomaly) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -13,6 +13,7 @@ public:
|
||||||
|
|
||||||
const std::string& getId() const;
|
const std::string& getId() const;
|
||||||
double getMass() const;
|
double getMass() const;
|
||||||
|
double getGravitationalParameter() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const std::string _id;
|
const std::string _id;
|
||||||
|
|
|
@ -22,6 +22,7 @@ class ParticleMap
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::map<std::string, Particle> _particles;
|
std::map<std::string, Particle> _particles;
|
||||||
|
// TODO: improve on this very vague name
|
||||||
std::map<std::string, std::string> _relationships;
|
std::map<std::string, std::string> _relationships;
|
||||||
std::map<std::string, Orbit> _orbits;
|
std::map<std::string, Orbit> _orbits;
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "astro/stateVectorIndices.hpp"
|
#include "astro/stateVectorIndices.hpp"
|
||||||
#include "astro/orbitalElementConversions.hpp"
|
#include "astro/orbitalElementConversions.hpp"
|
||||||
|
#include "astro/twoBodyMethods.hpp"
|
||||||
|
|
||||||
#include <glm/gtc/matrix_transform.hpp>
|
#include <glm/gtc/matrix_transform.hpp>
|
||||||
|
|
||||||
|
@ -87,9 +88,7 @@ const double Orbit::getEccentricAnomaly(const double meanAnomaly) const
|
||||||
return eccentricAnomaly;
|
return eccentricAnomaly;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Interpolate a position around the orbit.
|
glm::dvec3 Orbit::getPositionFromMeanAnomaly(const double meanAnomaly) const
|
||||||
// t is in range 0..1 and wraps.
|
|
||||||
glm::dvec3 Orbit::getPosition(const double meanAnomaly) const
|
|
||||||
{
|
{
|
||||||
Vector6 cartesian = getCartesianCoordinates(meanAnomaly);
|
Vector6 cartesian = getCartesianCoordinates(meanAnomaly);
|
||||||
return glm::dvec3(
|
return glm::dvec3(
|
||||||
|
@ -98,6 +97,13 @@ glm::dvec3 Orbit::getPosition(const double meanAnomaly) const
|
||||||
cartesian[astro::zPositionIndex]);
|
cartesian[astro::zPositionIndex]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glm::dvec3 Orbit::getPosition(double gravitationalParameter, double time) const
|
||||||
|
{
|
||||||
|
double meanMotion = astro::computeKeplerMeanMotion(getSemiMajorAxis(), gravitationalParameter);
|
||||||
|
double meanAnomaly = meanMotion * time;
|
||||||
|
return getPositionFromMeanAnomaly(meanAnomaly);
|
||||||
|
}
|
||||||
|
|
||||||
const double Orbit::getTrueAnomaly(const double meanAnomaly) const
|
const double Orbit::getTrueAnomaly(const double meanAnomaly) const
|
||||||
{
|
{
|
||||||
const double eccentricAnomaly = getEccentricAnomaly(meanAnomaly);
|
const double eccentricAnomaly = getEccentricAnomaly(meanAnomaly);
|
||||||
|
@ -114,11 +120,11 @@ const Vector6 Orbit::getCartesianCoordinates(const double meanAnomaly) const
|
||||||
return astro::convertKeplerianToCartesianElements(kepler, 1.0);
|
return astro::convertKeplerianToCartesianElements(kepler, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::dvec3 Orbit::getTangent(const double meanAnomaly) const
|
//glm::dvec3 Orbit::getTangent(const double meanAnomaly) const
|
||||||
{
|
//{
|
||||||
double epsilon = 0.01;
|
// double epsilon = 0.01;
|
||||||
glm::dvec3 ahead = getPosition(meanAnomaly + epsilon);
|
// glm::dvec3 ahead = getPosition(meanAnomaly + epsilon);
|
||||||
glm::dvec3 behind = getPosition(meanAnomaly - epsilon);
|
// glm::dvec3 behind = getPosition(meanAnomaly - epsilon);
|
||||||
return glm::normalize(ahead - behind);
|
// return glm::normalize(ahead - behind);
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "skein/particle.h"
|
#include "skein/particle.h"
|
||||||
|
|
||||||
|
#include <astro/constants.hpp>
|
||||||
|
|
||||||
Particle::Particle(const std::string& id, double mass)
|
Particle::Particle(const std::string& id, double mass)
|
||||||
: _id(id), _mass(mass)
|
: _id(id), _mass(mass)
|
||||||
{
|
{
|
||||||
|
@ -19,3 +21,8 @@ double Particle::getMass() const
|
||||||
{
|
{
|
||||||
return _mass;
|
return _mass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double Particle::getGravitationalParameter() const
|
||||||
|
{
|
||||||
|
return _mass * astro::ASTRO_GRAVITATIONAL_CONSTANT;
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#include "skein/particlemap.h"
|
#include "skein/particlemap.h"
|
||||||
#include "skein/particle.h"
|
#include "skein/particle.h"
|
||||||
|
|
||||||
|
|
||||||
const Particle& ParticleMap::getParticle(const std::string& id) const
|
const Particle& ParticleMap::getParticle(const std::string& id) const
|
||||||
{
|
{
|
||||||
return _particles.at(id);
|
return _particles.at(id);
|
||||||
|
@ -17,20 +16,13 @@ glm::dvec3 ParticleMap::getParticlePosition(const std::string& id, double time)
|
||||||
if (_orbits.find(id) == _orbits.end())
|
if (_orbits.find(id) == _orbits.end())
|
||||||
return {0,0,0};
|
return {0,0,0};
|
||||||
|
|
||||||
// TODO: actually get stuff based on physics
|
const std::string& parentId = _relationships.at(id);
|
||||||
//const Particle& parent = _relationships.at(id);
|
const Particle& parent = _particles.at(parentId);
|
||||||
|
const double gravitationalParameter = parent.getGravitationalParameter();
|
||||||
// how do we get the gravitational parameter?
|
|
||||||
// is it just G * M
|
|
||||||
// where M is the mass of the parent
|
|
||||||
//const double u = getGravitationalParameter(parent.getId());
|
|
||||||
//const double mass = parent.getMass();
|
|
||||||
|
|
||||||
// how do we get the particle position from the time + gravitational parameter?
|
|
||||||
|
|
||||||
// TODO: actually nest stuff so position is determined from all parents
|
// TODO: actually nest stuff so position is determined from all parents
|
||||||
const Orbit& orbit = _orbits.at(id);
|
const Orbit& orbit = _orbits.at(id);
|
||||||
return orbit.getPosition(time);
|
return orbit.getPosition(gravitationalParameter, time);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParticleMap::setParticle(const Particle& particle)
|
void ParticleMap::setParticle(const Particle& particle)
|
||||||
|
|
|
@ -128,7 +128,9 @@ void updateViewMatrix(GLuint shaderProgram, float time)
|
||||||
glm::mat4 view = glm::mat4(1.0);
|
glm::mat4 view = glm::mat4(1.0);
|
||||||
|
|
||||||
// Rotation
|
// Rotation
|
||||||
constexpr float angle = glm::radians(10.0);
|
// TODO: disconnect application and simulation time
|
||||||
|
constexpr float angle = 0;
|
||||||
|
//constexpr float angle = glm::radians(10.0);
|
||||||
glm::vec3 axis = glm::vec3(0.0, 1.0, 0.0);
|
glm::vec3 axis = glm::vec3(0.0, 1.0, 0.0);
|
||||||
view = glm::rotate(view, angle * time, axis);
|
view = glm::rotate(view, angle * time, axis);
|
||||||
|
|
||||||
|
|
11
src/main.cpp
11
src/main.cpp
|
@ -103,10 +103,10 @@ int main()
|
||||||
|
|
||||||
// set parameters of moon's orbit around earth
|
// set parameters of moon's orbit around earth
|
||||||
Orbit orbit;
|
Orbit orbit;
|
||||||
double semiMajorAxis = 3.84748e9;
|
double semiMajorAxis = 3.84748e8;
|
||||||
orbit.setSemiMajorAxis(semiMajorAxis); // metres
|
orbit.setSemiMajorAxis(semiMajorAxis); // metres
|
||||||
orbit.setEccentricity(0.055);
|
orbit.setEccentricity(0.055);
|
||||||
orbit.setInclination(glm::radians(5.15)); // radians?
|
orbit.setInclination(glm::radians(5.15)); // radians
|
||||||
orbit.setArgumentOfPeriapsis(318.15); // in the case of the moon these last two values are
|
orbit.setArgumentOfPeriapsis(318.15); // in the case of the moon these last two values are
|
||||||
orbit.setLongitudeOfAscendingNode(60.0); // pretty much constantly changing so use whatever
|
orbit.setLongitudeOfAscendingNode(60.0); // pretty much constantly changing so use whatever
|
||||||
|
|
||||||
|
@ -149,8 +149,11 @@ int main()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the moon takes like 27 days to orbit earth. to see this in motion, then, we need to
|
||||||
|
// increase the speed of time by 60 * 60 * 24 to see 1 day per second.
|
||||||
|
const double speed = 60 * 60 * 24;
|
||||||
|
|
||||||
// only update time if playing the orbiting animation
|
// only update time if playing the orbiting animation
|
||||||
const double speed = 0.5;
|
|
||||||
if (animation == ANIM_ORBITING)
|
if (animation == ANIM_ORBITING)
|
||||||
{
|
{
|
||||||
time = getTime() * speed;
|
time = getTime() * speed;
|
||||||
|
|
|
@ -27,8 +27,12 @@ void OrbitVisualizer::regenerateVertices()
|
||||||
|
|
||||||
for (int i = 0; i < _vertexCount; i++)
|
for (int i = 0; i < _vertexCount; i++)
|
||||||
{
|
{
|
||||||
|
// TODO: this method of getting ellipse vertices is a huge hack. it would be
|
||||||
|
// better to actually create a first-class ellipse object and use that to generate
|
||||||
|
// a nice continuous mesh, instead of using orbital positions.
|
||||||
float t = (float)i / (float)_vertexCount * 2.0 * _pi;
|
float t = (float)i / (float)_vertexCount * 2.0 * _pi;
|
||||||
glm::vec3 pos = _orbit.getPosition(t);
|
glm::vec3 pos = _orbit.getPositionFromMeanAnomaly(t);
|
||||||
|
|
||||||
// Vertices come out of the library with X and Y being in the 'flat' plane. Re-order them
|
// Vertices come out of the library with X and Y being in the 'flat' plane. Re-order them
|
||||||
// here such that Z is up.
|
// here such that Z is up.
|
||||||
float y = pos.z;
|
float y = pos.z;
|
||||||
|
|
Loading…
Reference in New Issue