Я пытаюсь смоделировать положение спутников GPS на земном шаре для набора эфемерид. У меня есть проверенный набор координат ECI ( http://en.wikipedia.org/wiki/Earth-centered_inertial ) XYZ и проверенный набор координат ECEF ( http://en.wikipedia.org/wiki/ECEF ) XYZ.
For example ( m ):
ECEF X 4076514.50
ECEF Y 14673598.00
ECEF Z -21793674.00
ECI X 8004604.50
ECI Y 12956032.00
ECI Z -21793674.00
Иногда знаки координат X и Y ECI противоположны знакам координат X и Y ECEF.
Когда я наношу эти места на глобус и, очевидно, они не совпадают, если вы не повернете землю на некоторое количество радианов. Я вижу, что если вы вращаете землю, координаты ECI следуют по наземной траектории, которая согласуется с наземной траекторией ECEF, но с моим текущим кодом они смещаются на разные величины, в зависимости от времени суток, в которое я их наношу.
Вот мой код:
// The radians earth rotates in 1 second
double earthRotation = 0.000072921151467;
// Do something different depending on the switch position
if ( self.shouldAnimate == true ) {
// The seconds since we started rotating
double newRotationMultiplier = [self.eciDate timeIntervalSinceDate:self.lastEciDate];
// Seconds // Rad/Sec // Multiplier
self.timeSinceOpenGlStarted = newRotationMultiplier * earthRotation;
matrixToRotate = GLKMatrix4Rotate(matrixToRotate, self.timeSinceOpenGlStarted, 0.0, 0.0, 1.0);
// Latch it so that when we stop rotating, it doesn't revert
self.effect.transform.modelviewMatrix = matrixToRotate;
}
Как определить радианы для вращения Земли, чтобы показать положения ECI в течение времени, чтобы они были одним и тем же местоположением на повернутом земном шаре (с точки зрения широты и долготы)? То есть, как мне рассчитать для любого времени UTC в день, насколько повернуть землю вокруг оси Z ("Вверх"), чтобы координаты ECI совпадали с координатами ECEF, и спутники оказались в одном и том же положении. над моим трехмерным глобусом?
ОБНОВЛЯТЬ:
Я заставил его работать - благодаря ответу ниже! Вот код:
// Get the NSDate components
NSCalendar *currentCalendar = [NSCalendar currentCalendar];
[currentCalendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSDateComponents *components = [currentCalendar components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:self.eciDate];
[components setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSInteger hour = [components hour];
NSInteger minute = [components minute];
NSInteger second = [components second];
// Get UTC in terms of decimal hours
float utc = hour + (float)minute/60.0f + (float)second/3600.0f; // UTC is expressed in hours as a decimal number
//NSLog(@"UTC: %f H %f M %f S %f",utc,(float)hour,(float)minute/60.0f ,(float)second/3600.0f);
// Get the seconds since the last vernal equinox
double secondsSinceVernalEquinox = [self.eciDate timeIntervalSinceDate:appDelegate.lastVernalEquinox];
// Do the math
// http://physics.stackexchange.com/questions/98466/radians-to-rotate-earth-to-match-eci-lat-lon-with-ecef-lat-lon
double d = secondsSinceVernalEquinox / ( 60.0 * 60.0 * 24.0 ); // Give decimal days
double p = 365.242187; // Length of tropical year
double result = ( M_PI * 2 / 24 ) * ( utc - 12.0 ) + ( 2 * M_PI * d / p );
//NSLog(@"Radians = %f",result);
// Seconds // Rad/Sec // Multiplier
self.timeSinceOpenGlStarted = result;
matrixToRotate = GLKMatrix4Rotate(matrixToRotate, self.timeSinceOpenGlStarted, 0.0, 0.0, 1.0);
// Latch it so that when we stop rotating, it doesn't revert
self.effect.transform.modelviewMatrix = matrixToRotate;
Отказ от ответственности: я обновил свой предыдущий ответ, так как нашел более точную формулу.
Угол поворота угол между точкой весны и меридианом в Гринвиче. Это также соответствует звездному времени по Гринвичу , преобразованному в радианы.
Для данного времени UTC и данной даты соответствующее гринвичское (среднее) звездное время (в часах и десятичных частях часа) может быть рассчитано как
пульсар