1 /**************************************************************************
3 * Written by Durk Talsma. Started October 1997, for the flight gear project.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 * (Log is kept at end of this file)
21 **************************************************************************/
30 #include "../general.h"
31 #include "../Main/views.h"
32 #include "../Time/fg_time.h"
34 struct CelestialCoord moonPos;
36 float xMoon, yMoon, zMoon;
40 static GLfloat vdata[12][3] =
42 {-X, 0.0, Z }, { X, 0.0, Z }, {-X, 0.0, -Z}, {X, 0.0, -Z },
43 { 0.0, Z, X }, { 0.0, Z, -X}, {0.0, -Z, -X}, {0.0, -Z, -X},
44 { Z, X, 0.0 }, { -Z, X, 0.0}, {Z, -X, 0.0 }, {-Z, -X, 0.0}
47 static GLuint tindices[20][3] =
49 {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1},
50 {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},
51 {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6},
52 {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11}
55 /* -------------------------------------------------------------
56 This section contains the code that generates a yellow
57 Icosahedron. It's under development... (of Course)
58 ______________________________________________________________*/
60 void NormalizeVector(float v[3])
62 GLfloat d = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
65 printf("zero length vector\n");
73 void drawTriangle(float *v1, float *v2, float *v3)
86 void subdivide(float *v1, float *v2, float *v3, long depth)
88 GLfloat v12[3], v23[3], v31[3];
93 drawTriangle(v1, v2, v3);
96 for (i = 0; i < 3; i++)
98 v12[i] = (v1[i] + v2[i]);
99 v23[i] = (v2[i] + v3[i]);
100 v31[i] = (v3[i] + v1[i]);
102 NormalizeVector(v12);
103 NormalizeVector(v23);
104 NormalizeVector(v31);
105 subdivide(v1, v12, v31, depth - 1);
106 subdivide(v2, v23, v12, depth - 1);
107 subdivide(v3, v31, v23, depth - 1);
108 subdivide(v12, v23, v31,depth - 1);
115 glClear(GL_COLOR_BUFFER_BIT);
117 glRotatef(spin, 0.0, 0.0, 0.0);
118 glColor3f(1.0, 1.0, 0.0);
119 // glBegin(GL_LINE_LOOP);
120 for (i = 0; i < 20; i++)
123 //glVertex3fv(&vdata[tindices[i][0]][0]);
124 //glVertex3fv(&vdata[tindices[i][1]][0]);
125 //glVertex3fv(&vdata[tindices[i][2]][0]);
127 subdivide(&vdata[tindices[i][0]][0],
128 &vdata[tindices[i][1]][0],
129 &vdata[tindices[i][2]][0], 3);
139 /* --------------------------------------------------------------
141 This section contains the code that calculates the actual
142 position of the moon in the night sky.
144 ----------------------------------------------------------------*/
146 struct CelestialCoord fgCalculateMoon(struct OrbElements params,
147 struct OrbElements sunParams,
150 struct CelestialCoord
154 eccAnom, ecl, lonecl, latecl, actTime,
155 xv, yv, v, r, xh, yh, zh, xg, yg, zg, xe, ye, ze,
158 /* calculate the angle between ecliptic and equatorial coordinate system */
159 actTime = fgCalcActTime(t);
160 ecl = fgDegToRad(23.4393 - 3.563E-7 * actTime); // in radians of course
162 /* calculate the eccentric anomaly */
163 eccAnom = fgCalcEccAnom(params.M, params.e);
165 /* calculate the moon's distance (d) and true anomaly (v) */
166 xv = params.a * ( cos(eccAnom) - params.e);
167 yv = params.a * ( sqrt(1.0 - params.e*params.e) * sin(eccAnom));
169 r = sqrt(xv*xv + yv*yv);
171 /* estimate the geocentric rectangular coordinates here */
172 xh = r * (cos(params.N) * cos(v + params.w) - sin(params.N) * sin(v + params.w) * cos(params.i));
173 yh = r * (sin(params.N) * cos(v + params.w) + cos(params.N) * sin(v + params.w) * cos(params.i));
174 zh = r * (sin(v + params.w) * sin(params.i));
176 /* calculate the ecliptic latitude and longitude here */
177 lonecl = atan2( yh, xh);
178 latecl = atan2( zh, sqrt( xh*xh + yh*yh));
180 /* calculate a number of perturbations */
181 Ls = sunParams.M + sunParams.w;
182 Lm = params.M + params.w + params.N;
186 lonecl += fgDegToRad(
187 - 1.274 * sin (params.M - 2*D) // the Evection
188 + 0.658 * sin (2 * D) // the Variation
189 - 0.186 * sin (sunParams.M) // the yearly variation
190 - 0.059 * sin (2*params.M - 2*D)
191 - 0.057 * sin (params.M - 2*D + sunParams.M)
192 + 0.053 * sin (params.M + 2*D)
193 + 0.046 * sin (2*D - sunParams.M)
194 + 0.041 * sin (params.M - sunParams.M)
195 - 0.035 * sin (D) // the Parallactic Equation
196 - 0.031 * sin (params.M + sunParams.M)
197 - 0.015 * sin (2*F - 2*D)
198 + 0.011 * sin (params.M - 4*D)
200 latecl += fgDegToRad(
201 - 0.173 * sin (F - 2*D)
202 - 0.055 * sin (params.M - F - 2*D)
203 - 0.046 * sin (params.M + F - 2*D)
204 + 0.033 * sin (F + 2*D)
205 + 0.017 * sin (2 * params.M + F)
209 - 0.58 * cos(params.M - 2*D)
213 xg = r * cos(lonecl) * cos(latecl);
214 yg = r * sin(lonecl) * cos(latecl);
215 zg = r * sin(latecl);
218 ye = yg * cos(ecl) - zg * sin(ecl);
219 ze = yg * sin(ecl) + zg * cos(ecl);
221 result.RightAscension = atan2(ye, xe);
222 result.Declination = atan2(ze, sqrt(xe*xe + ye*ye));
229 moon = glGenLists(1);
230 glNewList(moon, GL_COMPILE );
232 fgSolarSystemUpdate(&(pltOrbElements[1]), cur_time_params);
233 moonPos = fgCalculateMoon(pltOrbElements[1], pltOrbElements[0],
236 printf("Moon found at %f (ra), %f (dec)\n", moonPos.RightAscension,
237 moonPos.Declination);
240 /* xMoon = 90000.0 * cos(moonPos.RightAscension) * cos(moonPos.Declination);
241 yMoon = 90000.0 * sin(moonPos.RightAscension) * cos(moonPos.Declination);
242 zMoon = 90000.0 * sin(moonPos.Declination); */
244 xMoon = 60000.0 * cos(moonPos.RightAscension) * cos(moonPos.Declination);
245 yMoon = 60000.0 * sin(moonPos.RightAscension) * cos(moonPos.Declination);
246 zMoon = 60000.0 * sin(moonPos.Declination);
248 glColor3f(1.0, 1.0, 1.0);
249 glutSolidSphere(1.0, 10, 10);
256 void fgMoonRender() {
258 GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
260 l = &cur_light_params;
262 /* set lighting parameters */
263 glLightfv(GL_LIGHT0, GL_AMBIENT, l->scene_clear );
264 glLightfv(GL_LIGHT0, GL_DIFFUSE, color );
267 glTranslatef(xMoon, yMoon, zMoon);
268 glScalef(1400, 1400, 1400);
270 /* glColor3fv(color); */
271 /* glutSolidSphere(1.0, 25, 25); */