]> git.mxchange.org Git - flightgear.git/blob - Astro/moon.cxx
6e791f5feeb0cb1c9f118865ecea2bd8f1bcd318
[flightgear.git] / Astro / moon.cxx
1 /**************************************************************************
2  * moon.cxx
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). 
7  *
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.
12  *
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.
17  *
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.
21  *
22  * $Id$
23  * (Log is kept at end of this file)
24  **************************************************************************/
25
26 #include <FDM/flight.hxx>
27
28 #include <string.h>
29 #include "moon.hxx"
30 #include <Debug/logstream.hxx>
31 #include <Objects/texload.h>
32
33
34 #ifdef __BORLANDC__
35 #  define exception c_exception
36 #endif
37 #include <math.h>
38
39 static GLuint moon_texid;
40 static GLubyte *moon_texbuf;
41
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,
52                 5.1454,    0.00000,
53                 318.0634,  0.1643573223,
54                 60.266600, 0.000000,
55                 0.054900,  0.000000,
56                 115.3654,  13.0649929509, t)
57 {
58   string tpath, fg_tpath;
59   int width, height;
60   
61   FG_LOG( FG_GENERAL, FG_INFO, "Initializing Moon Texture");
62 #ifdef GL_VERSION_1_1
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);
68 #else
69 #  error port me
70 #endif
71
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);
75
76   // load in the texture data
77   tpath = current_options.get_fg_root() + "/Textures/" + "moon.rgb";
78   
79   if ( (moon_texbuf = read_rgb_texture(tpath.c_str(), &width, &height)) 
80        == NULL )
81   {
82     // Try compressed
83     fg_tpath = tpath + ".gz";
84     if ( (moon_texbuf = read_rgb_texture(fg_tpath.c_str(), &width, &height)) 
85          == NULL )
86     {
87         FG_LOG( FG_GENERAL, FG_ALERT, 
88                 "Error in loading moon texture " << tpath );
89         exit(-1);
90     } 
91   } 
92
93   glTexImage2D( GL_TEXTURE_2D,
94                 0,
95                 GL_RGB,
96                 256, 256,
97                 0,
98                 GL_RGB, GL_UNSIGNED_BYTE,
99                 moon_texbuf);
100 }
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
105  * of the moon. 
106  ****************************************************************************/
107 void Moon::updatePosition(fgTIME *t, Star *ourSun)
108 {
109   double 
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,
113     geoRa, geoDec;
114   
115   fgAIRCRAFT *air;
116   FGState *f;
117
118   air = &current_aircraft;
119   f = air->fdm_state;
120  
121   updateOrbElements(t);
122   actTime = fgCalcActTime(t);
123
124   // calculate the angle between ecliptic and equatorial coordinate system
125   // in Radians
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
132   
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));
137
138   // calculate the ecliptic latitude and longitude here
139   lonecl = atan2 (yh, xh);
140   latecl = atan2(zh, sqrt(xh*xh + yh*yh));
141
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();
146   Lm = M + w + N;
147   D = Lm - Ls;
148   F = Lm - N;
149   
150   lonecl += DEG_TO_RAD * (-1.274 * sin (M - 2*D)
151                           +0.658 * sin (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())
158                           -0.035 * sin(D)
159                           -0.031 * sin(M + ourSun->getM())
160                           -0.015 * sin(2*F - 2*D)
161                           +0.011 * sin(M - 4*D)
162                           );
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)
168                           );
169   r += (-0.58 * cos(M - 2*D)
170         -0.46 * cos(2*D)
171         );
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);
176   
177   xe = xg;
178   ye = yg * cos(ecl) -zg * sin(ecl);
179   ze = yg * sin(ecl) +zg * cos(ecl);
180
181   geoRa  = atan2(ye, xe);
182   geoDec = atan2(ze, sqrt(xe*xe + ye*ye));
183
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
187
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());
194   if (geoRa < 0)
195     geoRa += (2*FG_PI);
196   
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);
201 }
202
203
204 /************************************************************************
205  * void Moon::newImage(float ra, float dec)
206  *
207  * This function regenerates a new visual image of the moon, which is added to
208  * solarSystem display list.
209  *
210  * Arguments: Right Ascension and declination
211  *
212  * return value: none
213  **************************************************************************/
214 void Moon::newImage(float ra, float dec)
215 {
216   glEnable(GL_TEXTURE_2D);
217   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
218   glBindTexture(GL_TEXTURE_2D, moon_texid);
219
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);
223
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);
232 }
233
234
235
236
237
238
239