|
|
|
|
@ -64,28 +64,17 @@ createSatelliteMesh()
|
|
|
|
|
return sm; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
orbital_elements |
|
|
|
|
initOrbit() |
|
|
|
|
{ |
|
|
|
|
orbital_elements orbit = {}; |
|
|
|
|
|
|
|
|
|
double a = 26564.5; // kilometers
|
|
|
|
|
double e = 0.7411; |
|
|
|
|
orbit.ep = constructEllipseAE(a, e); |
|
|
|
|
orbit.mu = 398601.68; // NOTE: earth's gravitational parameter in km^3/s^2
|
|
|
|
|
return orbit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
updateSatellitePosition(entity& satellite) |
|
|
|
|
{ |
|
|
|
|
const static glm::mat4 xform = |
|
|
|
|
{ const static glm::mat4 xform = |
|
|
|
|
glm::rotate(glm::mat4(1.0), (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
|
|
|
|
|
|
// TODO: decouple framerate from time_step
|
|
|
|
|
g_orbit.nu = getPropagatedTrueAnomaly(g_orbit, g_orbit.nu, g_time_step); |
|
|
|
|
double r2 = getRadialDistance(g_orbit.ep.e, g_orbit.ep.p, g_orbit.nu); |
|
|
|
|
glm::vec2 coords = polarToRect(g_orbit.nu, r2); |
|
|
|
|
g_orbit.gamma = orbitGetFlightPathAngle(g_orbit.ep.e, g_orbit.nu); |
|
|
|
|
g_orbit.r = getRadialDistance(g_orbit.ep.e, g_orbit.ep.p, g_orbit.nu); |
|
|
|
|
g_orbit.v = orbitGetVelocity(g_orbit.epsilon, g_orbit.mu, g_orbit.r); |
|
|
|
|
glm::vec2 coords = polarToRect(g_orbit.nu, g_orbit.r); |
|
|
|
|
glm::vec3 v = g_orbit.pos = glm::vec3(coords, 0); |
|
|
|
|
entSetWorldPosition(satellite, xform * glm::vec4(v.x, v.y, v.z, 1)); |
|
|
|
|
} |
|
|
|
|
@ -127,7 +116,7 @@ void
|
|
|
|
|
postFrameCallback(render_state* rs) |
|
|
|
|
{ |
|
|
|
|
static orbital_elements c_orb = {}; |
|
|
|
|
orbitCopy(g_orbit, c_orb); |
|
|
|
|
c_orb = g_orbit; |
|
|
|
|
gooDraw(rs->handles->window, c_orb, g_time_step); |
|
|
|
|
|
|
|
|
|
// TODO: will need more validation from GUI as added
|
|
|
|
|
@ -142,9 +131,14 @@ postFrameCallback(render_state* rs)
|
|
|
|
|
|
|
|
|
|
if (validateEllipse(c_orb.ep)) { |
|
|
|
|
c_orb.ep = constructEllipseAE(c_orb.ep.a, c_orb.ep.e); |
|
|
|
|
ellipseCopy(c_orb.ep, g_orbit.ep); |
|
|
|
|
g_orbit.ep = c_orb.ep; |
|
|
|
|
entity& ellipse_entity = rs->render_groups[0].entities[0]; |
|
|
|
|
updateOrbit(g_orbit, g_ellipse3d, ellipse_entity); |
|
|
|
|
|
|
|
|
|
// TODO: would be nice to have an interface for
|
|
|
|
|
// updating/constructing an orbit
|
|
|
|
|
g_orbit.epsilon = orbitGetSpecificEnergy(g_orbit.ep.a, g_orbit.mu); |
|
|
|
|
g_orbit.h = orbitGetAngularMomentum(g_orbit.ep.p, g_orbit.mu); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -182,7 +176,7 @@ main()
|
|
|
|
|
dims.x / dims.y |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
g_orbit = initOrbit(); |
|
|
|
|
g_orbit = orbitInit(26564.5, 0.7411, 398601.68); |
|
|
|
|
ellipse_parameters ep = constructEllipseAB(g_orbit.ep.a, g_orbit.ep.b); |
|
|
|
|
|
|
|
|
|
// TODO: (renderer) this needs to be more convenient
|
|
|
|
|
|