|
|
|
|
@ -16,9 +16,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const double SCALING = 0.001; |
|
|
|
|
static orbital_elements g_orbit = {}; |
|
|
|
|
static ellipse_3d g_ellipse3d; |
|
|
|
|
static uint g_time_step = 100; |
|
|
|
|
static system_2body g_sys = {0}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
simple_mesh* |
|
|
|
|
@ -64,31 +62,34 @@ createSatelliteMesh()
|
|
|
|
|
return sm; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO: this should be 2 separate functions. 1 for updating the g_sys.sat true
|
|
|
|
|
// anomaly, and another for updating the renderer entity
|
|
|
|
|
void |
|
|
|
|
updateSatellitePosition(entity& satellite) |
|
|
|
|
{ const static glm::mat4 xform = |
|
|
|
|
updateSatellitePosition(entity& sat) |
|
|
|
|
{ |
|
|
|
|
// TODO: decouple framerate from time_step
|
|
|
|
|
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); |
|
|
|
|
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)); |
|
|
|
|
satellite& s1 = g_sys.sat; |
|
|
|
|
s1.theta = getPropagatedTrueAnomaly(g_sys, s1.theta, g_sys.time_step); |
|
|
|
|
s1.gamma = orbitGetFlightPathAngle(g_sys.ep.e, s1.theta); |
|
|
|
|
s1.r = orbitGetRadialDistance(g_sys.ep.e, g_sys.ep.p, s1.theta); |
|
|
|
|
s1.v = orbitGetVelocity(g_sys.epsilon, g_sys.body.mu, s1.r); |
|
|
|
|
glm::vec2 coords = polarToRect(s1.theta, s1.r); |
|
|
|
|
glm::vec3 v = s1.position = glm::vec3(coords, 0); |
|
|
|
|
entSetWorldPosition(sat, xform * glm::vec4(v.x, v.y, v.z, 1)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// NOTE: use ellipseValidate(orbit.ep) before calling to avoid failing
|
|
|
|
|
// assertions
|
|
|
|
|
// NOTE: use ellipseValidate(ep) before calling to avoid failing assertions
|
|
|
|
|
void |
|
|
|
|
updateOrbit(orbital_elements& orbit, ellipse_3d& e3d, entity& ellipse_entity) |
|
|
|
|
updateOrbit(system_2body sys, entity& ellipse_entity) |
|
|
|
|
{ |
|
|
|
|
orbit.ep = ellipseInitAE(orbit.ep.a, orbit.ep.e); |
|
|
|
|
ellipse3DUpdate(orbit.ep, e3d); |
|
|
|
|
//sys.ep = ellipseInitAE(sys.ep.a, sys.ep.e);
|
|
|
|
|
ellipse3DUpdate(sys.ep, sys.e3d); |
|
|
|
|
|
|
|
|
|
for (uint i = 0; i < e3d.vert_count; i++) |
|
|
|
|
ellipse_entity.mesh->vertices[i] = e3d.vertices[i]; |
|
|
|
|
for (uint i = 0; i < sys.e3d.vert_count; i++) |
|
|
|
|
ellipse_entity.mesh->vertices[i] = sys.e3d.vertices[i]; |
|
|
|
|
|
|
|
|
|
entUpdateSimpleMesh(ellipse_entity, ellipse_entity.mesh, GL_LINE_LOOP); |
|
|
|
|
} |
|
|
|
|
@ -108,19 +109,21 @@ preFrameCallback(render_state* rs)
|
|
|
|
|
|
|
|
|
|
if (is.window_closed || is.escape) |
|
|
|
|
rs->running = false; |
|
|
|
|
|
|
|
|
|
if (g_time_step > 0) |
|
|
|
|
updateSatellitePosition(rs->render_groups[0].entities[2]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
postFrameCallback(render_state* rs) |
|
|
|
|
{ |
|
|
|
|
static orbital_elements c_orb = {}; |
|
|
|
|
c_orb = g_orbit; |
|
|
|
|
gooDraw(rs->handles->window, c_orb, g_time_step); |
|
|
|
|
bool update_if_paused = false; |
|
|
|
|
//bool update_if_paused = false;
|
|
|
|
|
//static orbital_elements c_orb = {};
|
|
|
|
|
//c_orb = g_orbit;
|
|
|
|
|
gooDraw(rs->handles->window, g_sys); |
|
|
|
|
g_sys.ep = ellipseInitAE(g_sys.ep.a, g_sys.ep.e); |
|
|
|
|
entity& ellipse_entity = rs->render_groups[0].entities[0]; |
|
|
|
|
updateOrbit(g_sys, ellipse_entity); |
|
|
|
|
updateSatellitePosition(rs->render_groups[0].entities[2]); |
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
if (c_orb.nu != g_orbit.nu && |
|
|
|
|
((c_orb.nu >= 0 && c_orb.nu <= M_PI) || |
|
|
|
|
(c_orb.nu < 0 && c_orb.nu >= -1 * M_PI))) |
|
|
|
|
@ -144,7 +147,7 @@ postFrameCallback(render_state* rs)
|
|
|
|
|
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); |
|
|
|
|
updateOrbit(g_sys, ellipse_entity); |
|
|
|
|
|
|
|
|
|
// TODO: would be nice to have an interface for
|
|
|
|
|
// updating/constructing an orbit
|
|
|
|
|
@ -154,8 +157,9 @@ postFrameCallback(render_state* rs)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (g_time_step == 0 && update_if_paused) |
|
|
|
|
if (g_sys.time_step == 0 && update_if_paused) |
|
|
|
|
updateSatellitePosition(rs->render_groups[0].entities[2]); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
@ -184,9 +188,11 @@ main()
|
|
|
|
|
dims.x / dims.y |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// NOTE: semi-major axis in km, eccentricity, gravitational parameter
|
|
|
|
|
g_orbit = orbitInit(26564.5, 0.7411, 398601.68); |
|
|
|
|
ellipse_parameters ep = ellipseInitAB(g_orbit.ep.a, g_orbit.ep.b); |
|
|
|
|
double a = 26564.5; // NOTE: semi-major axis in km
|
|
|
|
|
double e = 0.7411; // NOTE: eccentricity
|
|
|
|
|
double mu = 398601.68; // NOTE: gravitational parameter
|
|
|
|
|
double r = 6378; // NOTE: body radius in km
|
|
|
|
|
g_sys = systemInit(gravBodyInit(mu, r), orbitInit(a, e)); |
|
|
|
|
|
|
|
|
|
// TODO: (renderer) this needs to be more convenient
|
|
|
|
|
shader_wrapper sw = { SIMPLE_SHADER, nullptr, rs->simple_shader }; |
|
|
|
|
@ -194,8 +200,8 @@ main()
|
|
|
|
|
rs->render_group_count = 1; |
|
|
|
|
|
|
|
|
|
entity& ellipse_entity = rs->render_groups[0].entities[0]; |
|
|
|
|
g_ellipse3d = ellipseInit3D(ep, 256); |
|
|
|
|
simple_mesh* sm = constructEllipseMesh(g_ellipse3d, glm::vec3(255, 0, 255)); |
|
|
|
|
g_sys.e3d = ellipseInit3D(g_sys.ep, 256); |
|
|
|
|
simple_mesh* sm = constructEllipseMesh(g_sys.e3d, glm::vec3(255, 0, 255)); |
|
|
|
|
entInitMesh(ellipse_entity, sm, GL_LINE_LOOP); |
|
|
|
|
entRotate(ellipse_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
|
|
|
|
|
|
@ -208,7 +214,7 @@ main()
|
|
|
|
|
sm = createSatelliteMesh(); |
|
|
|
|
entInitMesh(satellite_entity, sm, GL_TRIANGLES); |
|
|
|
|
entRotate(satellite_entity, (float) M_PI_2, glm::vec3(1, 0, 0)); |
|
|
|
|
entSetWorldPosition(satellite_entity, g_ellipse3d.vertices[0]); |
|
|
|
|
entSetWorldPosition(satellite_entity, g_sys.e3d.vertices[0]); |
|
|
|
|
|
|
|
|
|
renDoRenderLoop(rs, 60 , preFrameCallback, postFrameCallback); |
|
|
|
|
|
|
|
|
|
|