Changes to integrate Durk's moon/sun code updates + clean up.

This commit is contained in:
curt
1997-11-25 19:25:27 +00:00
parent 5730a47b00
commit b6f07f3058
5 changed files with 348 additions and 71 deletions
+163 -55
View File
@@ -1,5 +1,6 @@
/************************************************************************** /**************************************************************************
* moon.c * moon.c
* Written by Durk Talsma. Started October 1997, for the flight gear project.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as * modify it under the terms of the GNU General Public License as
@@ -26,13 +27,123 @@
#include "orbits.h" #include "orbits.h"
#include "moon.h" #include "moon.h"
#include "../general.h"
#include "../Main/views.h" #include "../Main/views.h"
#include "../Time/fg_time.h" #include "../Time/fg_time.h"
/* #include "../Aircraft/aircraft.h"*/
#include "../general.h" struct CelestialCoord
moonPos;
float xMoon, yMoon, zMoon;
/*
static GLfloat vdata[12][3] =
{
{-X, 0.0, Z }, { X, 0.0, Z }, {-X, 0.0, -Z}, {X, 0.0, -Z },
{ 0.0, Z, X }, { 0.0, Z, -X}, {0.0, -Z, -X}, {0.0, -Z, -X},
{ Z, X, 0.0 }, { -Z, X, 0.0}, {Z, -X, 0.0 }, {-Z, -X, 0.0}
};
static GLuint tindices[20][3] =
{
{0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1},
{8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},
{7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6},
{6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11}
};*/
GLint moon;
/* -------------------------------------------------------------
This section contains the code that generates a yellow
Icosahedron. It's under development... (of Course)
______________________________________________________________*/
/*
void NormalizeVector(float v[3])
{
GLfloat d = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
if (d == 0.0)
{
printf("zero length vector\n");
return;
}
v[0] /= d;
v[1] /= d;
v[2] /= d;
}
void drawTriangle(float *v1, float *v2, float *v3)
{
glBegin(GL_POLYGON);
//glBegin(GL_POINTS);
glNormal3fv(v1);
glVertex3fv(v1);
glNormal3fv(v2);
glVertex3fv(v2);
glNormal3fv(v3);
glVertex3fv(v3);
glEnd();
}
void subdivide(float *v1, float *v2, float *v3, long depth)
{
GLfloat v12[3], v23[3], v31[3];
GLint i;
if (!depth)
{
drawTriangle(v1, v2, v3);
return;
}
for (i = 0; i < 3; i++)
{
v12[i] = (v1[i] + v2[i]);
v23[i] = (v2[i] + v3[i]);
v31[i] = (v3[i] + v1[i]);
}
NormalizeVector(v12);
NormalizeVector(v23);
NormalizeVector(v31);
subdivide(v1, v12, v31, depth - 1);
subdivide(v2, v23, v12, depth - 1);
subdivide(v3, v31, v23, depth - 1);
subdivide(v12, v23, v31,depth - 1);
} */
/*
void display(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(spin, 0.0, 0.0, 0.0);
glColor3f(1.0, 1.0, 0.0);
// glBegin(GL_LINE_LOOP);
for (i = 0; i < 20; i++)
{
//glVertex3fv(&vdata[tindices[i][0]][0]);
//glVertex3fv(&vdata[tindices[i][1]][0]);
//glVertex3fv(&vdata[tindices[i][2]][0]);
subdivide(&vdata[tindices[i][0]][0],
&vdata[tindices[i][1]][0],
&vdata[tindices[i][2]][0], 3);
static GLint moon; }
// glEnd();
// glFlush();
glPopMatrix();
glutSwapBuffers();
} */
/* --------------------------------------------------------------
This section contains the code that calculates the actual
position of the moon in the night sky.
----------------------------------------------------------------*/
struct CelestialCoord fgCalculateMoon(struct OrbElements params, struct CelestialCoord fgCalculateMoon(struct OrbElements params,
struct OrbElements sunParams, struct OrbElements sunParams,
@@ -42,7 +153,7 @@ struct CelestialCoord fgCalculateMoon(struct OrbElements params,
result; result;
double double
eccAnom, ecl, lonecl, latecl, actTime, eccAnom, ecl, lonecl, latecl, actTime,
xv, yv, v, r, xh, yh, zh, xg, yg, zg, xe, ye, ze, xv, yv, v, r, xh, yh, zh, xg, yg, zg, xe, ye, ze,
Ls, Lm, D, F; Ls, Lm, D, F;
@@ -54,7 +165,7 @@ struct CelestialCoord fgCalculateMoon(struct OrbElements params,
eccAnom = fgCalcEccAnom(params.M, params.e); eccAnom = fgCalcEccAnom(params.M, params.e);
/* calculate the moon's distance (d) and true anomaly (v) */ /* calculate the moon's distance (d) and true anomaly (v) */
xv = params.a * ( cos(eccAnom) - params.e); xv = params.a * ( cos(eccAnom) - params.e);
yv = params.a * ( sqrt(1.0 - params.e*params.e) * sin(eccAnom)); yv = params.a * ( sqrt(1.0 - params.e*params.e) * sin(eccAnom));
v =atan2(yv, xv); v =atan2(yv, xv);
r = sqrt(xv*xv + yv*yv); r = sqrt(xv*xv + yv*yv);
@@ -75,7 +186,7 @@ struct CelestialCoord fgCalculateMoon(struct OrbElements params,
F = Lm - params.N; F = Lm - params.N;
lonecl += fgDegToRad( lonecl += fgDegToRad(
- 1.274 * sin (params.M - 2*D) // the Evection - 1.274 * sin (params.M - 2*D) // the Evection
+ 0.658 * sin (2 * D) // the Variation + 0.658 * sin (2 * D) // the Variation
- 0.186 * sin (sunParams.M) // the yearly variation - 0.186 * sin (sunParams.M) // the yearly variation
- 0.059 * sin (2*params.M - 2*D) - 0.059 * sin (2*params.M - 2*D)
@@ -97,9 +208,10 @@ struct CelestialCoord fgCalculateMoon(struct OrbElements params,
); /* Yep */ ); /* Yep */
r += ( r += (
- 0.58 * cos(params.M - 2*D) - 0.58 * cos(params.M - 2*D)
- 0.46 * cos(2*D) - 0.46 * cos(2*D)
); ); /* Ok! */
xg = r * cos(lonecl) * cos(latecl); xg = r * cos(lonecl) * cos(latecl);
yg = r * sin(lonecl) * cos(latecl); yg = r * sin(lonecl) * cos(latecl);
zg = r * sin(latecl); zg = r * sin(latecl);
@@ -108,67 +220,63 @@ struct CelestialCoord fgCalculateMoon(struct OrbElements params,
ye = yg * cos(ecl) - zg * sin(ecl); ye = yg * cos(ecl) - zg * sin(ecl);
ze = yg * sin(ecl) + zg * cos(ecl); ze = yg * sin(ecl) + zg * cos(ecl);
result.RightAscension = atan2(ye, xe); result.RightAscension = atan2(ye, xe);
result.Declination = atan2(ze, sqrt(xe*xe + ye*ye)); result.Declination = atan2(ze, sqrt(xe*xe + ye*ye));
return result; return result;
} }
void fgMoonInit() void fgMoonInit()
{ {
struct CelestialCoord // int i;
moonPos; // moon = glGenLists(1);
// glNewList(moon, GL_COMPILE );
moon = glGenLists(1); fgSolarSystemUpdate(&(pltOrbElements[1]), cur_time_params);
glNewList(moon, GL_COMPILE );
glBegin( GL_POINTS );
moonPos = fgCalculateMoon(pltOrbElements[1], pltOrbElements[0], cur_time_params); moonPos = fgCalculateMoon(pltOrbElements[1], pltOrbElements[0], cur_time_params);
#ifdef DEBUG
printf("Moon found at %f (ra), %f (dec)\n", moonPos.RightAscension, moonPos.Declination); printf("Moon found at %f (ra), %f (dec)\n", moonPos.RightAscension, moonPos.Declination);
/* give the moon a temporary color, for testing purposes */ #endif
glColor3f( 0.0, 1.0, 0.0); glColor3f(1.0, 1.0, 0.0);
glVertex3f( 190000.0 * cos(moonPos.RightAscension) * cos(moonPos.Declination),
190000.0 * sin(moonPos.RightAscension) * cos(moonPos.Declination),
190000.0 * sin(moonPos.Declination) );
glEnd();
glEndList();
}
void fgMoonRender() /* xMoon = 90000.0 * cos(moonPos.RightAscension) * cos(moonPos.Declination);
{ yMoon = 90000.0 * sin(moonPos.RightAscension) * cos(moonPos.Declination);
double angle; zMoon = 90000.0 * sin(moonPos.Declination); */
static double warp = 0;
struct VIEW *v;
struct fgTIME *t;
t = &cur_time_params; xMoon = 60000.0 * cos(moonPos.RightAscension) * cos(moonPos.Declination);
v = &current_view; yMoon = 60000.0 * sin(moonPos.RightAscension) * cos(moonPos.Declination);
zMoon = 60000.0 * sin(moonPos.Declination);
// glPushMatrix();
// glBegin(GL_TRIANGLES);
/*
for (i = 0; i < 20; i++)
subdivide(&vdata[tindices[i][0]][0],
&vdata[tindices[i][1]][0],
&vdata[tindices[i][2]][0], 3);*/
// glutSolidSphere(1.0, 25, 25);
glDisable( GL_FOG ); // glEnd();
glDisable( GL_LIGHTING ); // glPopMatrix();
glPushMatrix(); // glEndList();
glTranslatef( v->view_pos.x, v->view_pos.y, v->view_pos.z );
angle = t->gst * 15.0; /* 15 degrees per hour rotation */
/* warp += 1.0; */
/* warp = 15.0; */
warp = 0.0;
glRotatef( (angle+warp), 0.0, 0.0, -1.0 );
printf("Rotating moon by %.2f degrees + %.2f degrees\n",angle,warp);
glCallList(moon);
glPopMatrix();
glEnable( GL_LIGHTING );
glEnable( GL_FOG );
} }
/* $Log$ /* Draw the moon */
/* Revision 1.2 1997/10/28 21:00:21 curt void fgMoonRender() {
/* Changing to new terrain format. GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
/*
* Revision 1.1 1997/10/25 03:16:08 curt /* set lighting parameters */
* Initial revision of code contributed by Durk Talsma. glLightfv(GL_LIGHT0, GL_AMBIENT, color );
* glLightfv(GL_LIGHT0, GL_DIFFUSE, color );
*/ glMaterialfv(GL_FRONT, GL_AMBIENT, fgClearColor);
glMaterialfv(GL_FRONT, GL_DIFFUSE, color);
glPushMatrix();
glTranslatef(xMoon, yMoon, zMoon);
glScalef(1400, 1400, 1400);
/* glutSolidSphere(1.0, 25, 25); */
glutSolidSphere(1.0, 15, 15);
glPopMatrix();
}
+10 -3
View File
@@ -29,6 +29,10 @@
#include "orbits.h" #include "orbits.h"
#include "../Time/fg_time.h" #include "../Time/fg_time.h"
#include <math.h>
#define X .525731112119133606
#define Z .850650808352039932
/* Initialize the Moon Display management Subsystem */ /* Initialize the Moon Display management Subsystem */
@@ -42,15 +46,18 @@ struct CelestialCoord fgCalculateMoon(struct OrbElements Params,
struct fgTIME t); struct fgTIME t);
extern struct OrbElements pltOrbElements[9]; extern struct OrbElements pltOrbElements[9];
extern GLfloat fgClearColor[4];
#endif /* _MOON_H_ */ #endif /* _MOON_H_ */
/* $Log$ /* $Log$
/* Revision 1.2 1997/10/25 03:24:23 curt /* Revision 1.3 1997/11/25 19:25:35 curt
/* Incorporated sun, moon, and star positioning code contributed by Durk Talsma. /* Changes to integrate Durk's moon/sun code updates + clean up.
/* /*
* Revision 1.2 1997/10/25 03:24:23 curt
* Incorporated sun, moon, and star positioning code contributed by Durk Talsma.
*
* Revision 1.1 1997/10/25 03:16:09 curt * Revision 1.1 1997/10/25 03:16:09 curt
* Initial revision of code contributed by Durk Talsma. * Initial revision of code contributed by Durk Talsma.
* *
+14 -5
View File
@@ -43,17 +43,21 @@ double fgCalcActTime(struct fgTIME t)
/* a hack. This one introduces the 2000 problem into the program */ /* a hack. This one introduces the 2000 problem into the program */
year = t.gmt->tm_year + 1900; year = t.gmt->tm_year + 1900;
/* calculate the actual time */ /* calculate the actual time, rember to add 1 to tm_mon! */
actTime = 367 * year - 7 * actTime = 367 * year - 7 *
(year + (t.gmt->tm_mon + 9) / 12) / 4 + 275 * (year + ((t.gmt->tm_mon+1) + 9) / 12) / 4 + 275 *
t.gmt->tm_mon / 9 + t.gmt->tm_mday - 730530; (t.gmt->tm_mon+1) / 9 + t.gmt->tm_mday - 730530;
UT = t.gmt->tm_hour + ((double) t.gmt->tm_min / 60); UT = t.gmt->tm_hour + ((double) t.gmt->tm_min / 60);
/*printf("UT = %f\n", UT); */ /*printf("UT = %f\n", UT); */
actTime += (UT / 24.0); actTime += (UT / 24.0);
#define DEBUG 1
#ifdef DEBUG
printf("Actual Time:\n");
printf("current day = %f\t", actTime); printf("current day = %f\t", actTime);
printf("GMT = %d, %d, %d, %d, %d, %d\n", year, t.gmt->tm_mon, t.gmt->tm_mday, printf("GMT = %d, %d, %d, %d, %d, %d\n", year, t.gmt->tm_mon, t.gmt->tm_mday,
t.gmt->tm_hour, t.gmt->tm_min, t.gmt->tm_sec); t.gmt->tm_hour, t.gmt->tm_min, t.gmt->tm_sec);
#endif
return actTime; return actTime;
} }
@@ -132,7 +136,9 @@ void fgSolarSystemInit(struct fgTIME t)
printf("Cannot open data file: '%s'\n", path); printf("Cannot open data file: '%s'\n", path);
return; return;
} }
#ifdef DEBUG
printf("reading datafile %s", path); printf("reading datafile %s", path);
#endif
/* for all the objects... */ /* for all the objects... */
for (i = 0; i < 9; i ++) for (i = 0; i < 9; i ++)
@@ -164,7 +170,10 @@ void fgSolarSystemUpdate(struct OrbElements *planet, struct fgTIME t)
/* $Log$ /* $Log$
/* Revision 1.1 1997/10/25 03:16:10 curt /* Revision 1.2 1997/11/25 19:25:36 curt
/* Initial revision of code contributed by Durk Talsma. /* Changes to integrate Durk's moon/sun code updates + clean up.
/* /*
* Revision 1.1 1997/10/25 03:16:10 curt
* Initial revision of code contributed by Durk Talsma.
*
*/ */
+148 -6
View File
@@ -22,9 +22,18 @@
* (Log is kept at end of this file) * (Log is kept at end of this file)
**************************************************************************/ **************************************************************************/
#include <GL/glut.h>
#include "../Time/fg_time.h" #include "../Time/fg_time.h"
#include "../Main/views.h"
#include "orbits.h" #include "orbits.h"
#include "sun.h"
GLint sun;
static struct CelestialCoord
sunPos;
float xSun, ySun, zSun;
struct SunPos fgCalcSunPos(struct OrbElements params) struct SunPos fgCalcSunPos(struct OrbElements params)
{ {
@@ -38,24 +47,157 @@ struct SunPos fgCalcSunPos(struct OrbElements params)
EccAnom = fgCalcEccAnom(params.M, params.e); EccAnom = fgCalcEccAnom(params.M, params.e);
/* calculate the Suns distance (r) and its true anomaly (v) */ /* calculate the Suns distance (r) and its true anomaly (v) */
xv = cos(EccAnom) - params.e; xv = cos(EccAnom) - params.e;
yv = sqrt(1.0 - params.e*params.e) * sin(EccAnom); yv = sqrt(1.0 - params.e*params.e) * sin(EccAnom);
v = atan2(yv, xv); v = atan2(yv, xv);
r = sqrt(xv*xv + yv*yv); r = sqrt(xv*xv + yv*yv);
/* calculate the the Suns true longitude (lonsun) */ /* calculate the the Sun's true longitude (lonsun) */
lonSun = v + params.w; lonSun = v + params.w;
/* convert true longitude and distance to ecliptic rectangular geocentric /* convert true longitude and distance to ecliptic rectangular geocentric
coordinates (xs, ys) */ coordinates (xs, ys) */
solarPosition.xs = r * cos(lonSun); solarPosition.xs = r * cos(lonSun);
solarPosition.ys = r * sin(lonSun); solarPosition.ys = r * sin(lonSun);
return solarPosition; return solarPosition;
} }
struct CelestialCoord fgCalculateSun(struct OrbElements params, struct fgTIME t)
{
struct CelestialCoord
result;
struct SunPos
SolarPosition;
double
xe, ye, ze, ecl, actTime;
/* calculate the angle between ecliptic and equatorial coordinate system */
actTime = fgCalcActTime(t);
ecl = fgDegToRad(23.4393 - 3.563E-7 * actTime); // Angle now in Rads
/* calculate the sun's ecliptic position */
SolarPosition = fgCalcSunPos(params);
/* convert ecliptic coordinates to equatorial rectangular geocentric coordinates */
xe = SolarPosition.xs;
ye = SolarPosition.ys * cos(ecl);
ze = SolarPosition.ys * sin(ecl);
/* and finally... Calulate Right Ascention and Declination */
result.RightAscension = atan2( ye, xe);
result.Declination = atan2(ze, sqrt(xe*xe + ye*ye));
return result;
}
/* Initialize the Sun */
void fgSunInit()
{
// int i;
// sun = glGenLists(1);
// glNewList(sun, GL_COMPILE );
// glBegin( GL_POINTS );
fgSolarSystemUpdate(&(pltOrbElements[0]), cur_time_params);
sunPos = fgCalculateSun(pltOrbElements[0], cur_time_params);
#ifdef DEBUG
printf("Sun found at %f (ra), %f (dec)\n", sunPos.RightAscension, sunPos.Declination);
#endif
/* give the moon a temporary color, for testing purposes */
// glColor3f( 0.0, 1.0, 0.0);
// glVertex3f( 190000.0 * cos(moonPos.RightAscension) * cos(moonPos.Declination),
// 190000.0 * sin(moonPos.RightAscension) * cos(moonPos.Declination),
// 190000.0 * sin(moonPos.Declination) );
//glVertex3f(0.0, 0.0, 0.0);
// glEnd();
// glColor3f(1.0, 1.0, 1.0);
//xMoon = 190000.0 * cos(moonPos.RightAscension) * cos(moonPos.Declination);
//yMoon = 190000.0 * sin(moonPos.RightAscension) * cos(moonPos.Declination);
//zMoon = 190000.0 * sin(moonPos.Declination);
xSun = 60000.0 * cos(sunPos.RightAscension) * cos(sunPos.Declination);
ySun = 60000.0 * sin(sunPos.RightAscension) * cos(sunPos.Declination);
zSun = 60000.0 * sin(sunPos.Declination);
// glPushMatrix();
// glTranslatef(x, y, z);
// glScalef(16622.8, 16622.8, 16622.8);
// glBegin(GL_TRIANGLES);
// for (i = 0; i < 20; i++)
// subdivide(&vdata[tindices[i][0]][0],
// &vdata[tindices[i][1]][0],
// &vdata[tindices[i][2]][0], 3);
// glutSolidSphere(1.0, 25, 25);
// glEnd();
//glPopMatrix();
// glEndList();
}
/* Draw the Sun */
void fgSunRender() {
struct VIEW *v;
struct fgTIME *t;
GLfloat color[4] = { 0.85, 0.65, 0.05, 1.0 };
/* double x_2, x_4, x_8, x_10; */
/* GLfloat ambient; */
/* GLfloat amb[3], diff[3]; */
t = &cur_time_params;
v = &current_view;
/* x_2 = t->sun_angle * t->sun_angle;
x_4 = x_2 * x_2;
x_8 = x_4 * x_4;
x_10 = x_8 * x_2; */
/* ambient = (0.4 * pow(1.1, -x_10 / 30.0));
if ( ambient < 0.3 ) ambient = 0.3;
if ( ambient > 1.0 ) ambient = 1.0;
amb[0] = 0.50 + ((ambient * 6.66) - 1.6);
amb[1] = 0.00 + ((ambient * 6.66) - 1.6);
amb[2] = 0.00 + ((ambient * 6.66) - 1.6);
amb[3] = 0.00;
#ifdef DEBUG
printf("Color of the sun: %f, %f, %f\n"
"Ambient value : %f\n"
"Sun Angle : %f\n" , amb[0], amb[1], amb[2], ambient, t->sun_angle);
#endif
diff[0] = 0.0;
diff[1] = 0.0;
diff[2] = 0.0;
diff[3] = 0.0; */
/* set lighting parameters */
/* glLightfv(GL_LIGHT0, GL_AMBIENT, color );
glLightfv(GL_LIGHT0, GL_DIFFUSE, color );
glMaterialfv(GL_FRONT, GL_AMBIENT, amb);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diff); */
glDisable( GL_LIGHTING );
glPushMatrix();
glTranslatef(xSun, ySun, zSun);
glScalef(1400, 1400, 1400);
glColor3fv( color );
/* glutSolidSphere(1.0, 25, 25); */
glutSolidSphere(1.0, 10, 10);
//glCallList(sun);
glPopMatrix();
glEnable( GL_LIGHTING );
}
/* $Log$ /* $Log$
/* Revision 1.1 1997/10/25 03:16:11 curt /* Revision 1.2 1997/11/25 19:25:39 curt
/* Initial revision of code contributed by Durk Talsma. /* Changes to integrate Durk's moon/sun code updates + clean up.
/* /*
* Revision 1.1 1997/10/25 03:16:11 curt
* Initial revision of code contributed by Durk Talsma.
*
*/ */
+13 -2
View File
@@ -28,13 +28,24 @@
struct SunPos fgCalcSunPos(struct OrbElements sunParams); struct SunPos fgCalcSunPos(struct OrbElements sunParams);
extern struct OrbElements pltOrbElements[9];
extern GLfloat fgClearColor[4];
/* Initialize the Sun */
void fgSunInit();
/* Draw the Sun */
void fgSunRender();
#endif /* SUN_H */ #endif /* SUN_H */
/* $Log$ /* $Log$
/* Revision 1.1 1997/10/25 03:16:12 curt /* Revision 1.2 1997/11/25 19:25:39 curt
/* Initial revision of code contributed by Durk Talsma. /* Changes to integrate Durk's moon/sun code updates + clean up.
/* /*
* Revision 1.1 1997/10/25 03:16:12 curt
* Initial revision of code contributed by Durk Talsma.
*
*/ */