1 /**************************************************************************
3 * Written by Durk Talsma. Originally started October 1997, for distribution
4 * with the FlightGear project. Version 2 was written in August and
5 * September 1998. This code is based upon algorithms and data kindly
6 * provided by Mr. Paul Schlyter. (pausch@saaf.se).
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 * (Log is kept at end of this file)
24 **************************************************************************/
26 #include <FDM/flight.hxx>
30 #include <Debug/logstream.hxx>
31 #include <Objects/texload.h>
35 # define exception c_exception
39 static GLuint moon_texid;
40 static GLubyte *moon_texbuf;
42 /*************************************************************************
43 * Moon::Moon(fgTIME *t)
44 * Public constructor for class Moon. Initializes the orbital elements and
45 * sets up the moon texture.
46 * Argument: The current time.
47 * the hard coded orbital elements for Moon are passed to
48 * CelestialBody::CelestialBody();
49 ************************************************************************/
50 Moon::Moon(fgTIME *t) :
51 CelestialBody(125.1228, -0.0529538083,
53 318.0634, 0.1643573223,
56 115.3654, 13.0649929509, t)
58 string tpath, fg_tpath;
61 FG_LOG( FG_GENERAL, FG_INFO, "Initializing Moon Texture");
63 xglGenTextures(1, &moon_texid);
64 xglBindTexture(GL_TEXTURE_2D, moon_texid);
65 #elif GL_EXT_texture_object
66 xglGenTexturesEXT(1, &moon_texid);
67 xglBindTextureEXT(GL_TEXTURE_2D, moon_texid);
72 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
73 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
74 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
76 // load in the texture data
77 tpath = current_options.get_fg_root() + "/Textures/" + "moon.rgb";
79 if ( (moon_texbuf = read_rgb_texture(tpath.c_str(), &width, &height))
83 fg_tpath = tpath + ".gz";
84 if ( (moon_texbuf = read_rgb_texture(fg_tpath.c_str(), &width, &height))
87 FG_LOG( FG_GENERAL, FG_ALERT,
88 "Error in loading moon texture " << tpath );
93 glTexImage2D( GL_TEXTURE_2D,
98 GL_RGB, GL_UNSIGNED_BYTE,
101 /*****************************************************************************
102 * void Moon::updatePosition(fgTIME *t, Star *ourSun)
103 * this member function calculates the actual topocentric position (i.e.)
104 * the position of the moon as seen from the current position on the surface
106 ****************************************************************************/
107 void Moon::updatePosition(fgTIME *t, Star *ourSun)
110 eccAnom, ecl, lonecl, latecl, actTime,
111 xv, yv, v, r, xh, yh, zh, xg, yg, zg, xe, ye, ze,
112 Ls, Lm, D, F, mpar, gclat, rho, HA, g,
118 air = ¤t_aircraft;
121 updateOrbElements(t);
122 actTime = fgCalcActTime(t);
124 // calculate the angle between ecliptic and equatorial coordinate system
126 ecl = ((DEG_TO_RAD * 23.4393) - (DEG_TO_RAD * 3.563E-7) * actTime);
127 eccAnom = fgCalcEccAnom(M, e); // Calculate the eccentric anomaly
128 xv = a * (cos(eccAnom) - e);
129 yv = a * (sqrt(1.0 - e*e) * sin(eccAnom));
130 v = atan2(yv, xv); // the moon's true anomaly
131 r = sqrt (xv*xv + yv*yv); // and its distance
133 // estimate the geocentric rectangular coordinates here
134 xh = r * (cos(N) * cos (v+w) - sin (N) * sin(v+w) * cos(i));
135 yh = r * (sin(N) * cos (v+w) + cos (N) * sin(v+w) * cos(i));
136 zh = r * (sin(v+w) * sin(i));
138 // calculate the ecliptic latitude and longitude here
139 lonecl = atan2 (yh, xh);
140 latecl = atan2(zh, sqrt(xh*xh + yh*yh));
142 /* Calculate a number of perturbatioin, i.e. disturbances caused by the
143 * gravitational infuence of the sun and the other major planets.
144 * The largest of these even have a name */
145 Ls = ourSun->getM() + ourSun->getw();
150 lonecl += DEG_TO_RAD * (-1.274 * sin (M - 2*D)
152 -0.186 * sin(ourSun->getM())
153 -0.059 * sin(2*M - 2*D)
154 -0.057 * sin(M - 2*D + ourSun->getM())
155 +0.053 * sin(M + 2*D)
156 +0.046 * sin(2*D - ourSun->getM())
157 +0.041 * sin(M - ourSun->getM())
159 -0.031 * sin(M + ourSun->getM())
160 -0.015 * sin(2*F - 2*D)
161 +0.011 * sin(M - 4*D)
163 latecl += DEG_TO_RAD * (-0.173 * sin(F-2*D)
164 -0.055 * sin(M - F - 2*D)
165 -0.046 * sin(M + F - 2*D)
166 +0.033 * sin(F + 2*D)
167 +0.017 * sin(2*M + F)
169 r += (-0.58 * cos(M - 2*D)
172 FG_LOG(FG_GENERAL, FG_INFO, "Running moon update");
173 xg = r * cos(lonecl) * cos(latecl);
174 yg = r * sin(lonecl) * cos(latecl);
175 zg = r * sin(latecl);
178 ye = yg * cos(ecl) -zg * sin(ecl);
179 ze = yg * sin(ecl) +zg * cos(ecl);
181 geoRa = atan2(ye, xe);
182 geoDec = atan2(ze, sqrt(xe*xe + ye*ye));
184 // Given the moon's geocentric ra and dec, calculate its
185 // topocentric ra and dec. i.e. the position as seen from the
186 // surface of the earth, instead of the center of the earth
188 // First calculates the moon's parrallax, that is, the apparent size of the
189 // (equatorial) radius of the earth, as seen from the moon
190 mpar = asin ( 1 / r);
191 gclat = f->get_Latitude() - 0.003358 *
192 sin (2 * DEG_TO_RAD * f->get_Latitude() );
193 rho = 0.99883 + 0.00167 * cos(2 * DEG_TO_RAD * f->get_Latitude());
197 HA = t->lst - (3.8197186 * geoRa);
198 g = atan (tan(gclat) / cos ((HA / 3.8197186)));
199 rightAscension = geoRa - mpar * rho * cos(gclat) * sin(HA) / cos (geoDec);
200 declination = geoDec - mpar * rho * sin (gclat) * sin (g - geoDec) / sin(g);
204 /************************************************************************
205 * void Moon::newImage(float ra, float dec)
207 * This function regenerates a new visual image of the moon, which is added to
208 * solarSystem display list.
210 * Arguments: Right Ascension and declination
213 **************************************************************************/
214 void Moon::newImage(float ra, float dec)
216 glEnable(GL_TEXTURE_2D);
217 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
218 glBindTexture(GL_TEXTURE_2D, moon_texid);
220 //xglRotatef(-90, 0.0, 0.0, 1.0);
221 xglRotatef(((RAD_TO_DEG * ra)- 90.0), 0.0, 0.0, 1.0);
222 xglRotatef((RAD_TO_DEG * dec), 1.0, 0.0, 0.0);
224 FG_LOG( FG_GENERAL, FG_INFO,
225 "Ra = (" << (RAD_TO_DEG *ra)
226 << "), Dec= (" << (RAD_TO_DEG *dec) << ")" );
227 xglTranslatef(0.0, 58600.0, 0.0);
228 Object = gluNewQuadric();
229 gluQuadricTexture( Object, GL_TRUE );
230 gluSphere( Object, 1367, 12, 12 );
231 glDisable(GL_TEXTURE_2D);