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) ); }