|
osgEarth 2.1.1
|
Public Member Functions | |
| Sun () | |
| osg::Vec3d | getPosition (int year, int month, int date, double hoursUTC) const |
Definition at line 277 of file SkyNode.cpp.
| anonymous_namespace{SkyNode.cpp}::Sun::Sun | ( | ) | [inline] |
Definition at line 279 of file SkyNode.cpp.
{ }
| osg::Vec3d anonymous_namespace{SkyNode.cpp}::Sun::getPosition | ( | int | year, |
| int | month, | ||
| int | date, | ||
| double | hoursUTC | ||
| ) | const [inline] |
Definition at line 282 of file SkyNode.cpp.
{
double JD = getJulianDate(year, month, date);
double JD1 = (JD - JD2000); // julian time since JD2000 epoch
double JC = JD1/36525.0; // julian century
double mu = 282.937348 + 0.00004707624*JD1 + 0.0004569*(JC*JC);
double epsilon = 280.466457 + 0.985647358*JD1 + 0.000304*(JC*JC);
// orbit eccentricity:
double E = 0.01670862 - 0.00004204 * JC;
// mean anomaly of the perihelion
double M = epsilon - mu;
// perihelion anomaly:
double v =
M +
360.0*E*sin(d2r(M))/osg::PI +
900.0*(E*E)*sin(d2r(2*M))/4*osg::PI -
180.0*(E*E*E)*sin(d2r(M))/4.0*osg::PI;
// longitude of the sun in ecliptic coordinates:
double sun_lon = d2r(v - 360.0 + mu); // lambda
nrad2(sun_lon);
// angle between the ecliptic plane and the equatorial plane
double zeta = d2r(23.4392); // zeta
// latitude of the sun on the ecliptic plane:
double omega = d2r(0.0);
// latitude of the sun with respect to the equatorial plane (solar declination):
double sun_lat = asin( sin(sun_lon)*sin(zeta) );
nrad2(sun_lat);
// finally, adjust for the time of day (rotation of the earth)
double time_r = hoursUTC/24.0; // 0..1
nrad(sun_lon); // clamp to 0..TWO_PI
double sun_r = sun_lon/TWO_PI; // convert to 0..1
// rotational difference between UTC and current time
double diff_r = sun_r - time_r;
double diff_lon = TWO_PI * diff_r;
// apparent sun longitude.
double app_sun_lon = sun_lon - diff_lon + osg::PI;
nrad2(app_sun_lon);
#if 0
OE_INFO
<< "sun lat = " << r2d(sun_lat)
<< ", sun lon = " << r2d(sun_lon)
<< ", time delta_lon = " << r2d(diff_lon)
<< ", app sun lon = " << r2d(app_sun_lon)
<< std::endl;
#endif
return osg::Vec3d(
cos(sun_lat) * cos(-app_sun_lon),
cos(sun_lat) * sin(-app_sun_lon),
sin(sun_lat) );
}
Here is the call graph for this function:
1.7.3