Как вы можете предсказать орбиту, основываясь на начальном положении и начальном векторе направления?

Я разрабатываю планетарный симулятор в Unity 3D (C#), и мне нужна помощь, однако я чувствую, что это было бы лучшим местом для этого. Я начинаю свою планету с вектора положения. При инициализации я применяю вектор направления, который переводит его на орбиту вокруг более крупной звезды. Орбиты не круговые, и я бы хотел, чтобы они были эллиптическими.

Я читал про фокусы, большую полуось и малую полуось, про несколько законов Ньютона и Кеплера, я понимаю апоцентр и перицентр, но никак не могу понять, что мне нужно делать. Что я сделал, так это оставил след от планет, и можно было увидеть их орбиты. (примечание: я знаю, что расположение планет неправильное!)

планеты

Выглядит красиво, но это не то, что я хотел. Я хотел бы иметь возможность предсказывать орбиту. Я нашел уравнения, чтобы рассчитать сферу влияния, для которой нужна большая полуось. Я мог бы вычислить большую полуось, если бы у меня было время обращения, и я мог бы вычислить время обращения, если бы у меня была большая полуось. Однако у меня есть только начальное положение, вектор силы, которую я применил к нему, расстояние между планетами, а также массы каждой из них. Я в тупике, я не знаю, что ищу. Может ли кто-нибудь дать мне несколько указателей (или формул), чтобы сделать то, что я хотел бы сделать.

Буду очень признателен за любую помощь, заранее спасибо!

Что именно вы подразумеваете под «начальным вектором направления»? Если это то, что, я думаю, вы имеете в виду (единичный тангенс), вы не можете «предсказать орбиту на основе начального положения и начального вектора направления». Вектор положения имеет три степени свободы, но «вектор исходного направления» имеет только две. Какую бы схему ни использовали для описания орбиты (а их много), нужны шесть независимых параметров в конкретный момент времени. У тебя всего пять.
Несколько месяцев я работал над игрой/симулятором, и в конце концов мне пришлось отказаться от идеи сделать что-то математически элегантное. Я мог бы использовать законы Кеплера для орбит, ЕСЛИ вы предполагаете, что планеты не влияют друг на друга. Для планет это довольно правильно, но в меньшей степени для спутников и еще меньше для космических кораблей. Мне пришлось пойти с Ньютоном и использовать чисто итеративный подход. Разбейте время на достаточно маленькие сегменты и рассчитывайте все силы, воздействующие на каждый объект с каждым приращением. Просто, но вы не можете предсказать, где что-то будет в будущем, не рассчитывая каждый промежуточный момент.

Ответы (3)

В трех измерениях вам нужно шесть чисел. Вы спрашиваете, как преобразовать один набор из шести чисел, трех координат положения и трех компонентов скорости (обратите внимание, что простого направления недостаточно) в другой набор из шести чисел, шесть элементов орбиты.

Я не собираюсь давать вам уравнения, но я вас начну. Вы можете погуглить уравнения. Сначала вычислите энергию, скаляр. Это скажет вам, находится ли он на орбите (отрицательная энергия) или на гиперболе (положительная энергия). Из энергии вы можете легко вычислить большую полуось. Затем вычислите вектор углового момента. Направление этого вектора покажет вам плоскость траектории и направление в этой плоскости (этот вектор перпендикулярен плоскости траектории). Затем вычислите вектор эксцентриситета. Этот вектор будет лежать в плоскости и будет указывать на перицентр или ближайший подход к гиперболе. Его величина — это, конечно же, эксцентриситет орбиты или гипербола.

Тогда у вас будет все необходимое для создания элементов орбиты.

Я нашел несколько уравнений, и они ссылаются на G... как ни странно, в моем моделировании я не использовал G... я просто сделал F = (m1*m2)/d^2. Когда я его подставляю, он просто улетает и не обращает внимания на орбиту.
Обычно вы видите комбинацию грамм М центрального тела, иногда укорачивается до мю . В реальном мире мы никогда не используем грамм , потому что мы можем измерить грамм М гораздо точнее, чем любой грамм или же М .
У меня возникли проблемы с вычислением большой полуоси. Прежде всего я рассчитал орбитальную скорость (чтобы ее можно было подставить в другое уравнение). я использовал в знак равно р о о т ( М / р ) . Затем я рассчитал орбитальную энергию с помощью е знак равно в 2 / 2 ( м 1 + м 2 ) / р . Затем я использовал уравнение в 2 знак равно ( м 1 + м 2 ) ( 2 / р 1 / а ) , и переставить, чтобы найти большую полуось. Однако длина меняется по мере того, как планета вращается по орбите... Есть идеи, почему она это делает?
Во-первых, вам нужно грамм перед всеми м с. Во-вторых, ваши уравнения приводят к Е знак равно мю 2 а , из которого можно получить а . Е является константой движения, поэтому вы должны вычислить одно и то же значение в каждой точке орбиты. (Не используй е для удельной энергии, поскольку это символ эксцентриситета.)
Кстати, если вы предполагаете в знак равно мю р , то вы выходите на круговую орбиту. затем р не меняется, и а знак равно р .

Эта подпрограмма JPL/NAIF SPICE, инструментарий OSLT, отвечает на вопрос о проблеме двух тел.

NB Я предполагаю, что ваш «вектор направления» на самом деле является «вектором скорости»; вход СОСТОЯНИЯ в ОССКЕЛТ представляет собой шестиэлементный вектор, представляющий собой конкатенацию векторов положения и скорости.

NB, как отмечалось выше, вам нужно седьмое число: MU, значение GM для центрального тела.

Технически вам также нужно восьмое число, время начальных условий, чтобы иметь отправную точку для расчета будущих (и прошлых) эфемерид.

Эта ссылка предназначена для FORTRAN-версии инструментария SPICE, потому что именно ее Google вернул первой. Существуют также C, IDL, Matlab, Java и даже неофициальные интерфейсы Python для SPICE; создание DLL C-версии, которая может быть вызвана из C#, должна быть возможной.

Я не буду делать это дольше, чем это должно быть: покопайтесь в страницах SPICE; SPICE имеет крутую кривую обучения, но оно того стоит. Документация является лучшей, которую вы можете найти где угодно, или свяжитесь со мной для получения более подробной информации.

Простите отсутствие конкретного ответа, но это действительно зависит от того, насколько точным вам нужно быть. Однажды я написал симулятор, в котором использовалось ньютоновское приближение n тел. Это было хорошо, но не очень хорошо реализовано и могло поддерживать только пару десятков тел, прежде чем оно замедлилось до ползания.

KSP использует более простой и масштабируемый подход; космический корабль притягивает только тело, в сфере влияния которого он обитает, а планеты и луны ходят по рельсам. Это достаточно близкое приближение для видеоигры, и оно не выходит из-под контроля, когда вы добавляете в симуляцию новые объекты. Компромисс заключается в том, что это означает, что вас одновременно привлекает только один объект, поэтому вы не видите точек Лагранжа или других интересных гравитационных эффектов.

Даже хорошо реализованная ньютоновская модель n тел будет намного более затратной в вычислительном отношении, чем система KSP, и все равно не расскажет всей истории, поскольку ньютоновская физика не принимает во внимание релятивистские эффекты. (Если вы думаете, что релятивистские эффекты не имеют значения для орбитальной механики, почитайте о планете Вулкан: https://en.wikipedia.org/wiki/Vulcan_(hypothetical_planet) )

Возможно, стоит задать этот вопрос при обмене стеками разработки игр, поскольку решение о том, как лучше всего приблизить орбиту, имеет столько же общего с типом игрового процесса, который вы хотите, и с практическими ограничениями доступного вычислительного оборудования, сколько с физикой. орбитальная механика.

OP никогда не упоминает, что это для игры или что вычислительная мощность является проблемой. На самом деле, прочитав вопрос, у меня сложилось совершенно противоположное впечатление, что его планетарный симулятор в настоящее время разработан с точностью до орбиты, но он хотел бы более точно моделировать будущие орбиты произвольных объектов, вводя их эфемериды. TL; DR Я очень сомневаюсь, что упрощенная кинематика, которую использует KSP, подойдет.