Теперь в SpaceEngine можно наблюдать реальные солнечные и лунные затмения! Это видео показывает полное солнечное затмение 21 августа 2017 года, которое будет видно в США.

Прошлый месяц я работал над эфемеридами планет. Эфемериды - это таблицы данных и фрагменты кода, которые позволяют рассчитать точные координаты и скорости планет и спутников Солнечной системы на любой заданный момент времени. Ранее в SpaceEngine использовались Кеплеровы орбиты, которые являются хорошим приближением движения планеты вокруг Солнца (или луны вокруг планеты) в отсутствие возмущений. Но настоящая Солнечная система не так проста, в ней есть много планет и лун, которые тянут друг друга своей гравитацией. Это возмущает их орбиты, что делает кеплеровское решение неточным. Наиболее сильно возмущениям подвержены луны, как можете видеть на видео ниже - их орбиты прецессируют и раскачиваются.

Чтобы предсказать движение планет и спутников, астрономы используют N-body моделирование на суперкомпьютерах. В начале из наблюдений получаются таблицы начальных векторов состояния (координат и скоростей) всех основных тел Солнечной системы (Солнца, планет, спутников, сотен крупных астероидов, и даже используется аналитическая модель колец Сатурна). Потом запускается N-body симуляция, аналогичная той, которую вы можете запустить в Universe Sandbox. Но, в отличие от игры, научное моделирование очень точное и учитывает множество различных тонких эффектов, таких как неравномерность гравитационного потенциала сплюснутых планет, масконы на Луне и релятивистские эффекты. Моделирование проводится до сотен или тысяч лет в обоих направлениях - в будущее и в прошлое. После завершения получаются большие наборы данных, которые не очень удобны в использовании. Поэтому астрономы выводят аналитическое решение, которое с некоторой точностью аппроксимирует полученные результаты, или строят более компактные таблицы данных и выводят формулы для интерполяции между точками в этих таблицах. Иногда можно разработать полностью аналитическую модель движения какого-либо объекта.

Существует множество таких решений («теорий») движения планет и лун: VSOP87, DE405, TASS 1.7 и т.д., которые затем используются для расчёта координат объектов, прогнозирования затмений, планирования космических полётов; также они используются в различных программах-планетариях. С точки зрения применения в SE, их можно разделить на две категории:

  • Аналитические модели: используют числовые ряды (полиномиальные или Фурье) для аппроксимации движения тела. Они, как правило, меньше (таблицы данных ограничены несколькими мегабайтами) и быстрее, потому что большинство из них были разработаны десятилетия назад, когда компьютеры были слабыми и имели небольшую память. Их также можно легко сделать ещё меньше и быстрее, отбросив младшие члены рядов (за счёт снижения точности). VSOP87 является одной из них. Некоторые аналитические модели не ограничены во времени, но их точность, конечно, уменьшается, если вы уходите слишком далеко в будущее или в прошлое.
  • Модели на основе таблиц данных: как правило, более современные; представляют собой таблицы коэффициентов, идущие с шагом в несколько дней. Эти коэффициенты передаются в формулы, которые вычисляют координаты и скорости планет на нужную дату. Такие модели, как правило, требуют много памяти (файлы данных имеют размеры в сотни мегабайт), и работают только в пределах ограниченного промежутка времени (несколько сотен или тысяч лет). DE436 является одной из них.
  • На настоящий момент я реализовал следующие теории в SpaceEngine:

  • VSOP87 (French: Variations Séculaires des Orbites Planétaires) - эта теория включает только 8 больших планет и Солнце (да, оно тоже движется). Рабочий временной интервал: неограничен, но рекомендуется для лет с -2000 (2000 г. до н.э.) по 6000.
  • DE436 (Jet Propulsion Laboratory Development Ephemeris) - эта теория включает в себя только 8 больших планет, Солнце, Луну и барицентр системы Плутона, а также вращение Луны. Поддерживается все существующие файлы данных DExxx. Рабочий временной интервал: ограничен файлом данных, для DE436 - с 1550 по 2560.
  • NOE-4-2007 (V. Lainey) - эта теория включает только спутники Марса: Фобос и Деймос. Рабочий период времени: неограниченный, но рекомендуется только с 1877 по 2025.
  • L1.2 (V. Lainey, L. Duriez, A. Vienne) - эта теория включает только 4 Галилеевых спутника Юпитера: Ио, Европу, Ганимед и Каллисто. Рабочий временной интервал: с 1140 по 2760, может быть увеличен ценой снижения точности.
  • TASS 1.7 (A. Vienne, L. Duriez) - эта теория включает только 8 больших спутников Сатурна: Мимас, Энцелад, Тефию, Диону, Рею, Титан, Гиперион и Япет. Рабочий временной интервал: неограничен.
  • GUST86 (J. Laskar, R. Jacobson) - эта теория включает только 5 больших спутников Урана: Миранду, Ариэль, Умбриэль, Титанию и Оберон. Рабочий временной интервал: неограничен.
  • Н. Емельянов, М. Самородов - аналитическая теория движения Тритона, спутника Нептуна. Рабочий временной интервал: неограничен.
  • Вне рабочего временного интервала орбитальной теории SE использует экстраполяцию. Вычисляются первые или последние доступные координаты и вектор скорости тела, и по ним строится простая кеплеровская орбита.

    Существует много других теорий, включая альтернативные теории для указанных выше тел, и теории для малых спутников. Я добавлю некоторые из них в SE позже. Обратите внимание, что теория VSOP87 не включает Луну, а единственная теория движения Луны, реализованная для SE, - это DExxx, поэтому следующая версия SE будет поставляться с файлом данных DE436 (около 100 Мб). В будущем я планирую реализовать теорию движения Луны ELP2000-82, поэтому VSOP87 можно будет сделать основной моделью (у неё нет больших файлов данных, и она обладает гораздо большим рабочим диапазоном времени, чем DE436). Существует более современная её версия - VSOP2013, но она также требует большие файлы данных (несколько по 300 Мб).

    SE поддерживает все эфемериды JPL (DExxx), их можно скачать непосредственно с FTP сервера JPL. Там есть замечательное решение DE431 для планет, Солнца и Луны - оно имеет огромный рабочий промежуток времени в 30 000 лет (с -13200 г. до 17191 г.), но его файл данных весит аж 2,6 ГБ. По идее, SpaceEngine должен работать с ним, но я не проверял; SE может не хватить памяти (в настоящее время SE загружает файл в ОЗУ целиком, и ограничен 4 Гб, как 32-битное приложение). Доступные файлы на сервере JPL заканчиваются на DE431, но в верхних папках есть файлы в формате ASCII и утилита asc2eph.f, с помощью которой их можно преобразовать в бинарный формат, поддерживаемый SE (вам необходимо установить компилятор Fortran для компиляции и запуска утилиты). Сервер JPL также имеет таблицы данных для сотен астероидов и всех смоделированных спутников, но их суммарный размер составляет несколько десятков гигабайт - я думаю, это избыточно для SE.

    Я также реализовал аналитические модели осевого вращения планет и лун, основанные на документе рабочей группы МАС по картографическим координатам и вращательным элементам (WGCCRE). Они моделируют прецессию осей вращения тел и малые периодические возмущения, но действительны только в ограниченном промежутке времени, как и орбитальные теории. Прецессия земной оси там не смоделирована, для неё нужна другая аналитическая модель. Вращение Луны также моделируется решением DE436, поэтому тут есть две альтернативы.

    Для поддержки аналитических орбитальных теорий, я изменил способ рендера линий орбит в SE. Раньше для каждого тела генерировалась своя «модель» линии, её форма и размер зависели от параметров орбиты. Но потом я понял, что, поскольку все кеплеровы орбиты - это конические сечения (эллипс, парабола или гипербола), они могут быть нарисованы всего тремя различными моделями, с соответствующим масштабированием и смещением - окружностью, параболой и гиперболой. Это очень изящный и быстрый метод, потому что теперь можно использовать инстансинг для отображения тысяч орбит разом. Также экономится память и время загрузки (нет необходимости создавать и хранить тысячи моделей). Обновление изменяющихся орбит в режиме реального времени (аналитические орбиты планет, а также орбиты кораблей) теперь вообще бесплатное - надо просто вычислить новый масштаб/сдвиг для этих трёх моделей.