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 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));
232 l = &cur_light_params;
234 moon = xglGenLists(1);
235 xglNewList(moon, GL_COMPILE );
237 /* xglMaterialfv(GL_FRONT, GL_AMBIENT, l->scene_clear);
238 xglMaterialfv(GL_FRONT, GL_DIFFUSE, moon_color); */
240 fgSolarSystemUpdate(&(pltOrbElements[1]), cur_time_params);
241 moonPos = fgCalculateMoon(pltOrbElements[1], pltOrbElements[0],
244 printf("Moon found at %f (ra), %f (dec)\n", moonPos.RightAscension,
245 moonPos.Declination);
248 /* xMoon = 90000.0 * cos(moonPos.RightAscension) * cos(moonPos.Declination);
249 yMoon = 90000.0 * sin(moonPos.RightAscension) * cos(moonPos.Declination);
250 zMoon = 90000.0 * sin(moonPos.Declination); */
252 xMoon = 60000.0 * cos(moonPos.RightAscension) * cos(moonPos.Declination);
253 yMoon = 60000.0 * sin(moonPos.RightAscension) * cos(moonPos.Declination);
254 zMoon = 60000.0 * sin(moonPos.Declination);
256 glutSolidSphere(1.0, 15, 15);
263 void fgMoonRender() {
265 GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
266 GLfloat moon_color[4] = { 1.0, 1.0, 1.0, 1.0 };
268 l = &cur_light_params;
270 /* set lighting parameters */
271 xglLightfv(GL_LIGHT0, GL_AMBIENT, l->scene_clear );
272 xglLightfv(GL_LIGHT0, GL_DIFFUSE, moon_color );
274 xglMaterialfv(GL_FRONT, GL_AMBIENT, l->scene_clear );
275 xglMaterialfv(GL_FRONT, GL_AMBIENT, moon_color );
276 xglMaterialfv(GL_FRONT, GL_DIFFUSE, moon_color);
279 xglTranslatef(xMoon, yMoon, zMoon);
280 xglScalef(1400, 1400, 1400);
282 xglColor3fv(moon_color);
283 /* glutSolidSphere(1.0, 25, 25); */