diff --git a/src/main.cpp b/src/main.cpp index df76f55..eba061b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -79,12 +79,12 @@ updateSatellitePosition(entity& satellite) entSetWorldPosition(satellite, xform * glm::vec4(v.x, v.y, v.z, 1)); } -// NOTE: use validateEllipse(orbit.ep) before calling to avoid failing +// NOTE: use ellipseValidate(orbit.ep) before calling to avoid failing // assertions void updateOrbit(orbital_elements& orbit, ellipse_3d& e3d, entity& ellipse_entity) { - orbit.ep = constructEllipseAE(orbit.ep.a, orbit.ep.e); + orbit.ep = ellipseInitAE(orbit.ep.a, orbit.ep.e); ellipse3DUpdate(orbit.ep, e3d); for (uint i = 0; i < e3d.vert_count; i++) @@ -133,14 +133,15 @@ postFrameCallback(render_state* rs) if (!ellipsesEqual(c_orb.ep, g_orbit.ep)) { // NOTE: handle the case where semimajor axis lowered with low // eccentricity would fail validation - if (c_orb.ep.a < g_orbit.ep.a && c_orb.ep.a > 0 + if (c_orb.ep.a < g_orbit.ep.a + && c_orb.ep.a > 0 && c_orb.ep.e == g_orbit.ep.e) { c_orb.ep.b = c_orb.ep.a * sqrt(1 - pow(c_orb.ep.e, 2.0)); } - if (validateEllipse(c_orb.ep)) { - c_orb.ep = constructEllipseAE(c_orb.ep.a, c_orb.ep.e); + if (ellipseValidate(c_orb.ep)) { + c_orb.ep = ellipseInitAE(c_orb.ep.a, c_orb.ep.e); g_orbit.ep = c_orb.ep; entity& ellipse_entity = rs->render_groups[0].entities[0]; updateOrbit(g_orbit, g_ellipse3d, ellipse_entity); @@ -185,7 +186,7 @@ main() // NOTE: semi-major axis in km, eccentricity, gravitational parameter g_orbit = orbitInit(26564.5, 0.7411, 398601.68); - ellipse_parameters ep = constructEllipseAB(g_orbit.ep.a, g_orbit.ep.b); + ellipse_parameters ep = ellipseInitAB(g_orbit.ep.a, g_orbit.ep.b); // TODO: (renderer) this needs to be more convenient shader_wrapper sw = { SIMPLE_SHADER, nullptr, rs->simple_shader }; @@ -193,7 +194,7 @@ main() rs->render_group_count = 1; entity& ellipse_entity = rs->render_groups[0].entities[0]; - g_ellipse3d = constructEllipse3D(ep, 256); + g_ellipse3d = ellipseInit3D(ep, 256); simple_mesh* sm = constructEllipseMesh(g_ellipse3d, glm::vec3(255, 0, 255)); entInitMesh(ellipse_entity, sm, GL_LINE_LOOP); entRotate(ellipse_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); diff --git a/src/orbits.cpp b/src/orbits.cpp index a55f522..cb45c2a 100644 --- a/src/orbits.cpp +++ b/src/orbits.cpp @@ -3,7 +3,7 @@ ellipse_parameters -constructEllipseAB(double a, double b) +ellipseInitAB(double a, double b) { assert(a > 0 && b > 0 && a >= b); ellipse_parameters ep = { a, b }; @@ -16,15 +16,15 @@ constructEllipseAB(double a, double b) } ellipse_parameters -constructEllipseAE(double a, double e) +ellipseInitAE(double a, double e) { assert(e >= 0 && e < 1); double b = a * sqrt(1 - pow(e, 2.0)); - return constructEllipseAB(a, b); + return ellipseInitAB(a, b); } bool -validateEllipse(const ellipse_parameters& ep) +ellipseValidate(const ellipse_parameters& ep) { // TODO: find out why satellite position gets wonky with orbit // eccentricity > 0.995 while passing through true anom = 0. @@ -45,7 +45,7 @@ ellipsesEqual(ellipse_parameters& e1, ellipse_parameters& e2) } ellipse_3d -constructEllipse3D(ellipse_parameters ep, uint vert_count) +ellipseInit3D(ellipse_parameters ep, uint vert_count) { assert(ep.a > 0 && ep.b > 0 && ep.a >= ep.b && @@ -70,7 +70,7 @@ orbitInit(double a, double e, double mu) void orbitUpdate(orbital_elements& o, double a, double e) { - o.ep = constructEllipseAE(a, e); + o.ep = ellipseInitAE(a, e); o.epsilon = orbitGetSpecificEnergy(o.ep.a, o.mu); o.h = orbitGetAngularMomentum(o.ep.p, o.mu); } diff --git a/src/orbits.h b/src/orbits.h index 3dc2a8e..5ce8d77 100644 --- a/src/orbits.h +++ b/src/orbits.h @@ -34,24 +34,59 @@ struct orbital_elements glm::vec3 pos; // NOTE: true anomaly in 3d with ep.f2 at origin double v; // NOTE: velocity magnitute double gamma; // NOTE: (γ) flight path angle +#endif }; struct ellipse_3d { + // TODO: would be better to have a higher level composite object so we + // don't have to store this twice ellipse_parameters ep; glm::vec3* vertices; uint vert_count; }; +struct gravitational_body +{ + double mu; // NOTE: (μ) gravitational parameter + double radius; // NOTE: radius of ideal sphere representing the body + // double r_atmos; // TODO: bodies w/ atmosphere +}; + +struct satellite +{ + glm::vec3 position; + glm::vec3 velocity; + // double theta; // NOTE: true anomaly + // double r; // NOTE: radius magnitude + // double gamma; // NOTE: (γ) flight path angle + // double v; // NOTE: velocity magnitute +}; + +// NOTE: top level composite for 2 body system +struct system +{ + gravitational_body grav_body; + satellite sat; + //ellipse_parameters ep; + ellipse_3d e3d; + orbital_elements elements; + + double epsilon; // NOTE: (ε) specific orbital energy, MJ/kg + double h; // NOTE: angular momentum + double r_apoapsis; // NOTE: apoapse distance from body center + double r_periapsis; // NOTE: periapsis distance from body center +}; + ellipse_parameters -constructEllipseAB(double a, double b); +ellipseInitAB(double a, double b); ellipse_parameters -constructEllipseAE(double a, double e); +ellipseInitAE(double a, double e); bool -validateEllipse(const ellipse_parameters& ep); +ellipseValidate(const ellipse_parameters& ep); bool ellipsesEqual(ellipse_parameters& e1, ellipse_parameters& e2); @@ -59,7 +94,7 @@ ellipsesEqual(ellipse_parameters& e1, ellipse_parameters& e2); // NOTE: create vertices for a 3d ellipse // NOTE: all vertices are in the x/y plane with z = 0 ellipse_3d -constructEllipse3D(ellipse_parameters ep, uint vert_count); +ellipseInit3D(ellipse_parameters ep, uint vert_count); void ellipse3DUpdate(ellipse_parameters ep, ellipse_3d& e3d); diff --git a/tests/orbit_test.cpp b/tests/orbit_test.cpp index 1963fd4..21df5a4 100644 --- a/tests/orbit_test.cpp +++ b/tests/orbit_test.cpp @@ -22,7 +22,7 @@ TEST_CASE("orbit propagation", "[orbits]") orbital_elements orbit = {}; double a = 26564.5; // kilometers double e = 0.7411; - ellipse_parameters ep = constructEllipseAE(a, e); + ellipse_parameters ep = ellipseInitAE(a, e); orbit.ep = ep; double initial_anom = 260 * M_PI / 180; // radians unsigned int time_step = 60 * 50; // seconds