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 **************************************************************************/
26 #include "../XGL/xgl.h"
31 #include "../Include/general.h"
32 #include "../Main/views.h"
33 #include "../Time/fg_time.h"
35 struct CelestialCoord moonPos;
37 static float xMoon, yMoon, zMoon;
41 static GLfloat vdata[12][3] =
43 {-X, 0.0, Z }, { X, 0.0, Z }, {-X, 0.0, -Z}, {X, 0.0, -Z },
44 { 0.0, Z, X }, { 0.0, Z, -X}, {0.0, -Z, -X}, {0.0, -Z, -X},
45 { Z, X, 0.0 }, { -Z, X, 0.0}, {Z, -X, 0.0 }, {-Z, -X, 0.0}
48 static GLuint tindices[20][3] =
50 {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1},
51 {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},
52 {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6},
53 {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11}
56 /* -------------------------------------------------------------
57 This section contains the code that generates a yellow
58 Icosahedron. It's under development... (of Course)
59 ______________________________________________________________*/
61 void NormalizeVector(float v[3])
63 GLfloat d = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
66 printf("zero length vector\n");
74 void drawTriangle(float *v1, float *v2, float *v3)
77 //xglBegin(GL_POINTS);
87 void subdivide(float *v1, float *v2, float *v3, long depth)
89 GLfloat v12[3], v23[3], v31[3];
94 drawTriangle(v1, v2, v3);
97 for (i = 0; i < 3; i++)
99 v12[i] = (v1[i] + v2[i]);
100 v23[i] = (v2[i] + v3[i]);
101 v31[i] = (v3[i] + v1[i]);
103 NormalizeVector(v12);
104 NormalizeVector(v23);
105 NormalizeVector(v31);
106 subdivide(v1, v12, v31, depth - 1);
107 subdivide(v2, v23, v12, depth - 1);
108 subdivide(v3, v31, v23, depth - 1);
109 subdivide(v12, v23, v31,depth - 1);
116 xglClear(GL_COLOR_BUFFER_BIT);
118 xglRotatef(spin, 0.0, 0.0, 0.0);
119 xglColor3f(1.0, 1.0, 0.0);
120 // xglBegin(GL_LINE_LOOP);
121 for (i = 0; i < 20; i++)
124 //xglVertex3fv(&vdata[tindices[i][0]][0]);
125 //xglVertex3fv(&vdata[tindices[i][1]][0]);
126 //xglVertex3fv(&vdata[tindices[i][2]][0]);
128 subdivide(&vdata[tindices[i][0]][0],
129 &vdata[tindices[i][1]][0],
130 &vdata[tindices[i][2]][0], 3);
140 /* --------------------------------------------------------------
142 This section contains the code that calculates the actual
143 position of the moon in the night sky.
145 ----------------------------------------------------------------*/
147 struct CelestialCoord fgCalculateMoon(struct OrbElements params,
148 struct OrbElements sunParams,
151 struct CelestialCoord
155 eccAnom, ecl, lonecl, latecl, actTime,
156 xv, yv, v, r, xh, yh, zh, xg, yg, zg, xe, ye, ze,
159 /* calculate the angle between ecliptic and equatorial coordinate system */
160 actTime = fgCalcActTime(t);
161 ecl = fgDegToRad(23.4393 - 3.563E-7 * actTime); // in radians of course
163 /* calculate the eccentric anomaly */
164 eccAnom = fgCalcEccAnom(params.M, params.e);
166 /* calculate the moon's distance (d) and true anomaly (v) */
167 xv = params.a * ( cos(eccAnom) - params.e);
168 yv = params.a * ( sqrt(1.0 - params.e*params.e) * sin(eccAnom));
170 r = sqrt(xv*xv + yv*yv);
172 /* estimate the geocentric rectangular coordinates here */
173 xh = r * (cos(params.N) * cos(v + params.w) - sin(params.N) * sin(v + params.w) * cos(params.i));
174 yh = r * (sin(params.N) * cos(v + params.w) + cos(params.N) * sin(v + params.w) * cos(params.i));
175 zh = r * (sin(v + params.w) * sin(params.i));
177 /* calculate the ecliptic latitude and longitude here */
178 lonecl = atan2( yh, xh);
179 latecl = atan2( zh, sqrt( xh*xh + yh*yh));
181 /* calculate a number of perturbations */
182 Ls = sunParams.M + sunParams.w;
183 Lm = params.M + params.w + params.N;
187 lonecl += fgDegToRad(
188 - 1.274 * sin (params.M - 2*D) // the Evection
189 + 0.658 * sin (2 * D) // the Variation
190 - 0.186 * sin (sunParams.M) // the yearly variation
191 - 0.059 * sin (2*params.M - 2*D)
192 - 0.057 * sin (params.M - 2*D + sunParams.M)
193 + 0.053 * sin (params.M + 2*D)
194 + 0.046 * sin (2*D - sunParams.M)
195 + 0.041 * sin (params.M - sunParams.M)
196 - 0.035 * sin (D) // the Parallactic Equation
197 - 0.031 * sin (params.M + sunParams.M)
198 - 0.015 * sin (2*F - 2*D)
199 + 0.011 * sin (params.M - 4*D)
201 latecl += fgDegToRad(
202 - 0.173 * sin (F - 2*D)
203 - 0.055 * sin (params.M - F - 2*D)
204 - 0.046 * sin (params.M + F - 2*D)
205 + 0.033 * sin (F + 2*D)
206 + 0.017 * sin (2 * params.M + F)
210 - 0.58 * cos(params.M - 2*D)
214 xg = r * cos(lonecl) * cos(latecl);
215 yg = r * sin(lonecl) * cos(latecl);
216 zg = r * sin(latecl);
219 ye = yg * cos(ecl) - zg * sin(ecl);
220 ze = yg * sin(ecl) + zg * cos(ecl);
222 result.RightAscension = atan2(ye, xe);
223 result.Declination = atan2(ze, sqrt(xe*xe + ye*ye));
230 static int dl_exists = 0;
232 l = &cur_light_params;
234 /* position the moon */
235 fgSolarSystemUpdate(&(pltOrbElements[1]), cur_time_params);
236 moonPos = fgCalculateMoon(pltOrbElements[1], pltOrbElements[0],
239 printf("Moon found at %f (ra), %f (dec)\n", moonPos.RightAscension,
240 moonPos.Declination);
246 /* printf("First time through, creating moon display list\n"); */
248 moon = xglGenLists(1);
249 xglNewList(moon, GL_COMPILE );
251 /* xglMaterialfv(GL_FRONT, GL_AMBIENT, l->scene_clear);
252 xglMaterialfv(GL_FRONT, GL_DIFFUSE, moon_color); */
255 xMoon = 60000.0 * cos(moonPos.RightAscension) *
256 cos(moonPos.Declination);
257 yMoon = 60000.0 * sin(moonPos.RightAscension) *
258 cos(moonPos.Declination);
259 zMoon = 60000.0 * sin(moonPos.Declination);
261 glutSolidSphere(1.0, 10, 10);
269 void fgMoonRender() {
271 GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
273 l = &cur_light_params;
275 xglMaterialfv(GL_FRONT, GL_AMBIENT, l->sky_color );
276 xglMaterialfv(GL_FRONT, GL_DIFFUSE, white);
279 xglTranslatef(xMoon, yMoon, zMoon);
280 xglScalef(1400, 1400, 1400);