Как предсказать столкновение корабля со сферой влияния тела в 2D

Давно слушаю, звоню впервые. Я делаю небольшую игру для хобби в XNA, о транспортных кораблях в космосе, аналогичных контейнеровозам в море. Мне нужно иметь возможность предсказать встречу между Кораблем и планетой/спутниками гравитационная сфера влияния в ограниченной 2D-среде. Положения во времени Корабля и планеты/луны, сокращенно Тела, определяются по элементам кеплеровской орбиты. Корабль и Тело вращаются вокруг одного и того же центра притяжения.

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

Если эти проверки определяют, что столкновение возможно, я определяю минимальное и максимальное расстояние от центра притяжения, на котором Корабль может столкновение. Затем я получаю точки пересечения орбиты кораблей с двумя окружностями, определяемыми этим минимумом и максимумом. Это приводит к нулю, двум или четырем точкам на орбите Корабля, определяя ноль, один или два периода, когда он может столкнуться со сферой Тела. В этот момент, если нет пересечений, возможно, что вся орбита корабля находится в зоне столкновения, это, вероятно, необычный крайний случай, но его необходимо учитывать.

Я могу получить время прохождения Кораблем этих точек на своей орбите, давая одно или два окна времени для проверки встречи, но отсюда мое лучшее решение — найти промежуток времени, разделив его на шаги, вычислив положение Тела в точке. те времена, а затем тестирование для встречи.

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

Существуют ли какие-либо свойства конфокальных конических форм, которые могут помочь сократить пространство поиска? Или есть другие способы предсказать столкновение/столкновение между тем, что фактически является точкой, движущейся по коническому пути, и кругом, движущимся по эллипсу, имеющим общую точку фокусировки.


person pagnatious    schedule 22.02.2013    source источник
comment
Поскольку вы говорите о гравитации и вращении, вам следует проверить Осмос.   -  person ElKamina    schedule 22.02.2013
comment
Я играл в некоторые из них, особенно в один из уровней с сферами, вращающимися вокруг центра. Хорошая, весёлая игра. Я пытаюсь создать что-то похожее на исправленный конический предсказатель в космической программе Kerbal, но в ограниченной 2D-среде.   -  person pagnatious    schedule 22.02.2013
comment
В настоящее время вы используете интеграцию Эйлера, которая подходит для большинства приложений, предполагающих достаточно малый временной шаг. Ваш вопрос, я думаю, таков: учитывая тот факт, что траектория корабля следует известной геометрической форме, можем ли мы аналитически определить пересечения с другой известной геометрической формой? В частности, конфокальные конические сечения пересекаются с суммой Минковского окружности и эллипса.   -  person AndyG    schedule 23.02.2013
comment
В этом сценарии я не использую никакой интеграции, позиции объектов определяются исключительно из элементов орбиты и времени. Это менее реалистично, чем если бы движение кораблей было интегрировано, так как вы действуете только под действием гравитации от одного объекта, а не от N. Например, корабль, вращающийся вокруг Земли, не будет подвергаться гравитации Луны, но его положение будет полностью предсказуемым для любой произвольный момент времени, не считая встреч. Я никогда не слышал о дополнении Минковского, но я думаю, что вы правы. Это дало бы путь, пройденный сферой влияния по эллипсу, верно?   -  person pagnatious    schedule 23.02.2013
comment
Я предполагаю, что вам придется создать геометрию, представляющую площадь, занимаемую объектами между шагами во времени (вспомните Донни Дарко) после вычисления позиций-текущей и позиции-следующей. Это было бы сложно, потому что пересечение между этими геометриями не гарантировало бы фактическое столкновение, но было бы хорошим индикатором того, что вы должны сделать что-то более сложное в вычислительном отношении. Хотя у меня нет ничего, связанного с кривыми, я бы не отказался от любой помощи по этому поводу: github.com/aaronandy/vertesaur< /а>   -  person Dandy    schedule 13.03.2013
comment
Насколько дорого вычислить следующий шаг движения? т.е. если вы работаете со скоростью, скажем, 60 кадров в секунду, какой процент каждого кадра используется для физики? Можете ли вы просто запустить симуляцию на максимальной скорости (эквивалентной, скажем, 15 кадрам в секунду) и, таким образом, предсказать будущее на основе этого? Я не могу себе представить, чтобы физика была такой дорогой, если вам не нужно проводить тестирование столкновений, если только у вас нет множества объектов, применяющих гравитацию друг к другу! -edit- о, вы не используете интеграцию... почему бы и нет? Я думаю, что большинство игр, основанных на физике, в той или иной форме используют интеграцию.   -  person Wayne Uroda    schedule 13.03.2013
comment
Интеграция хороша и все такое, но есть возможность выбрать любой момент времени, в прошлом или будущем, и определить положение планет/кораблей (помимо встреч с другими телами). Сценарий Кеплера с двумя телами полностью детерминирован и предсказуем. Это дорого, поскольку вам нужно решить уравнение Кеплера, это может оказаться не самой дорогой функцией, но я действительно намереваюсь использовать ее во многих сущностях, и даже если бы я не касается стоимости, есть вопрос интервала проверки. Вы не хотите искать в достаточно больших прыжках, чтобы пропустить встречу.   -  person pagnatious    schedule 14.03.2013
comment
@Dandy: я могу сузить диапазон возможных времен до двух периодов, времени, когда корабль пройдет через туннель времени планеты. Затем я хочу быть умным в том, чтобы сказать, будет ли планета там в то же время, а затем найти точную точку встречи. Возможно, мне просто придется искать, используя какой-то достаточно маленький интервал времени, но я надеялся, что есть что-то лучше, чем просто грубая сила.   -  person pagnatious    schedule 14.03.2013
comment
Я ничего не знаю об играх, но все всегда пытаются аппроксимировать задачи трех тел более простыми задачами двух тел. Но доминирующее влияние не является единственным влиянием. Если бы это был настоящий космический корабль со мной на борту, я бы хотел, чтобы численное моделирование было достаточно точным, чтобы НЕ пренебрегать луной и солнцем только потому, что я нахожусь на орбите вокруг Земли. На программисте может быть даже проще, хотя на компьютере тяжелее, просто сделать полную сумму всех сил.   -  person criticalfix    schedule 14.03.2013
comment
@criticalfix Я намеревался полностью интегрировать движение корабля, получая влияние от всех тел и используя длительное постепенное ускорение. Тем не менее, я также хочу иметь возможность прогнозировать прибытие/отсутствие в пунктах назначения, как для помощи игроку, так и для кораблей ИИ, чтобы они могли надежно путешествовать. Единственный способ предсказать это — заранее спроецировать позиции. Положения планет могут быть кэшированы для использования несколькими кораблями, но каждый корабль должен будет использовать достаточно маленькие шаги, чтобы быть надежным и достаточно далеко, чтобы быть полезным для каждого рассматриваемого изменения курса. Я думал, что это будет слишком дорого и [1/2]   -  person pagnatious    schedule 15.03.2013
comment
@criticalfix В конце концов я решил, что предсказуемость и надежность для меня важнее полного реализма. НАСА использовало приближение с заплатками-конусами в предварительной навигации, а также проблему Ламберта и переносы Хаффмана, каждое из которых делает разные предположения (единичное притяжение, мгновенное ускорение и планеты, вращающиеся по круговой орбите, соответственно), которыми часто можно пренебречь или исправить в середине полета. Я надеялся, что сколько бы мне ни приходилось делать расчетов положения во времени, в конечном итоге это будет стоить меньше, чем проектирование. Хотя я могу ошибаться в этом. [2/2]   -  person pagnatious    schedule 15.03.2013
comment
@neontapir У меня нет, но, вероятно, следует. Я спросил здесь, так как там было больше населения, и проблема не ограничивалась только областью игр. У них вполне может быть некоторое понимание, я должен опубликовать его там.   -  person pagnatious    schedule 15.03.2013
comment
Можете ли вы отправить мне свой адрес электронной почты; У меня есть куча статей на эту тему (мой адрес электронной почты указан на моей странице SO)   -  person Rody Oldenhuis    schedule 17.05.2013
comment
Я не вижу ваш адрес электронной почты на странице вашего профиля, но я думаю, что мой указан в моем профиле.   -  person pagnatious    schedule 17.05.2013
comment
Итак, вы решили проблему? А как насчет вашей игры, вы довели ее до логического конца? Есть ли возможность увидеть результат?   -  person Victor    schedule 11.12.2017


Ответы (3)


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

Примените величину притяжения каждого круга к скорости движения каждого корабля. Движение может быть выполнено с помощью простого триггера, cos() для x, sin() для y, нет необходимости в каких-либо более сложных математических вычислениях. Если расстояние между любыми двумя объектами меньше суммы их радиусов, то произошло столкновение.

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

person Jon Harbour    schedule 14.03.2013
comment
Я не уверен, что понимаю, что вы предлагаете. Конечно, они оба могут быть представлены кругами, влияние планет - это круг в моем 2D случае, но я не слежу за движением друг к другу... хоть немного, по мере уменьшения расстояния? Тогда вы, кажется, объясняете способ имитации гравитации в круговых движениях? Используя просто кос и грех? В настоящее время у меня нет проблем с симуляцией гравитации, вопрос был не в этом. - person pagnatious; 20.03.2013
comment
Я пытался ответить на ваш вопрос. Или есть другие способы предсказать встречу/столкновение между тем, что фактически является точкой, движущейся по конической траектории, и кругом, движущимся по эллипсу, имеющим общую точку фокусировки. Возможно, это был не тот подход, который вы искали, но термин «хобби-игра» заставил меня поверить, что вы могли бы рассмотреть более простое предложение, а не сложное. Действительно ли конический — лучшее слово для описания гравитации в 2D? Это скорее движение по спирали. - person Jon Harbour; 25.03.2013
comment
Нет, коническая она в 2D и 3D. Кеплер показал это лучше, чем я. Это могла быть спираль, если бы корабль обеспечивал собственное ускорение, а также ускорение от силы тяжести. Возможно, это в первую очередь хобби, но моя цель — как можно больше смоделировать небесную механику. - person pagnatious; 26.03.2013
comment
Спасибо за предложение. - person pagnatious; 26.03.2013

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

Это должно хорошо работать при условии, что планета движется намного медленнее, чем движение корабля, — тогда функция будет относительно гладкой, и метод Ньютона не будет иметь проблем со сходимостью. Однако если планета движется намного быстрее, чем корабль, то эта функция расстояния будет подпрыгивать вверх и вниз, как «пружина», наложенная на некоторую параболоподобную кривую, и, возможно, несколько раз пересечет ось x. У метода Ньютона могут возникнуть проблемы с такими функциями, где производная быстро меняет направление.

Будем надеяться, что некоторые члены сократятся, когда вы создадите функцию расстояния, или выражение можно упростить или аппроксимировать каким-либо иным образом, но в противном случае может быть достаточно искать нули в вертикальном и горизонтальном направлениях. (На самом деле вы можете выбрать расстояния вдоль любой оси — например, большой оси орбиты планеты.) Нули в любой из этих функций являются необходимыми, но недостаточными условиями для столкновения, и их может быть проще вычислить. Если у вас есть список нулей в направлении x, отсортированный по времени, и такой же список нулей в направлении y, вы можете найти любые истинные столкновения, вычислив их пересечение слиянием списка (а-ля сортировка слиянием).

person j_random_hacker    schedule 15.03.2013
comment
Нули в этой функции будут точками пересечения корабля с центром планеты? Я бы искал точки на функции, где расстояние (в квадрате) равно радиусу влияния (в квадрате). Для кораблей, путешествующих в системе (например, Луна (или выше) к станции на низкой околоземной орбите), цель вполне может совершить несколько оборотов по орбите, создавая такую ​​пружину. Кроме того, метод Ньютона уже используется для получения положения во времени для каждого тела, значит ли это, что вы не можете создать функцию, которая представляет расстояние между ними во времени? - person pagnatious; 15.03.2013
comment
Я упростил, смоделировав расстояние между двумя точками; если гравитационная сфера влияния является сферой (т. е. кругом в 2D), то расстояние, которое мы на самом деле хотим вычислить, — это кратчайшее расстояние между точкой (кораблем) и кругом (GSI). К счастью, это очень простая корректировка: просто вычтите радиус GSI из расстояния между центром планеты и кораблем! :) (Это даст вам расстояние со знаком, когда корабль находится внутри GSI, но нам все равно, потому что мы ищем только нули.) Боюсь, я не понял вашего последнего предложения. - person j_random_hacker; 16.03.2013
comment
Чтобы получить функцию расстояния между планетой и кораблем с течением времени, у вас должно быть что-то вроде f (t) = s (t) - p (t), и, как вы сказали, члены, надеюсь, сократятся. Чтобы получить положение, вам нужна истинная аномалия, чтобы получить ее во времени, вам нужно получить эксцентрическую аномалию из средней аномалии (которая является единственным аспектом орбиты, который постоянно меняется со временем). Уравнение эксцентрической аномалии M = E - e*sin(E), которое не имеет решения в замкнутой форме. Итак, для каждого s(t) и p(t) вам нужно численно решить это уравнение, поэтому я не знаю, как бы вы определили f(t). - person pagnatious; 16.03.2013

Поскольку на этот вопрос еще нет принятого ответа, и я не вижу приведенных ниже расчетов, я добавлю их в надежде, что это кому-то поможет. Я не понял, как получить время даты, однако я понял, как получить углы. Это даст вам расстояние между орбитальным телом и сои (или кораблем), если вы знаете угол:

public static double RadiusAtAngle(double angle, double semiLatusRectum, double eccentricity)
{
    return semiLatusRectum / (1 + eccentricity * Math.Cos(angle)); 
}

Что еще более важно, перевернув этот расчет, вы получите угол к краю soi, если вы знаете semiLatusRectum и эксцентриситет (радиус здесь будет расстоянием от тела до края soi):

public static double AngleAtRadus(double radius, double semiLatusRectum, double eccentricity)
{
    //r = p / (1 + e * cos(θ))
    //1 + e * cos(θ) = p/r
    //((p / r) -1) / e = cos(θ)
    return Math.Acos((semiLatusRectum / radius - 1) / eccentricity);
}

Для справки, semiLatusRectum можно найти из semiMajorAxis и эксцентриситета:

public static double SemiLatusRectum(double SemiMajorAxis, double eccentricity)
{
    if (eccentricity == 0)//ie a circle 
        return SemiMajorAxis;
    return SemiMajorAxis * (1 - eccentricity * eccentricity);
}

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

person se5a    schedule 26.05.2019
comment
Я задал другой вопрос о той же проблеме и получил там ответ: stackoverflow.com/questions/16501182/ Я никогда не делал игры из этого, но логика предсказания столкновения работала хорошо, несмотря на все мои тесты. Может быть недостаточно дешевым, чтобы запускать его во время игры, никогда не заходил достаточно далеко, чтобы определить это. Я все еще планирую очистить его и опубликовать в Интернете, но жизнь продолжает мешать. - person pagnatious; 27.05.2019
comment
Интересно, если у вас все еще есть преобразование C# для этого, я бы хотел взглянуть, ссылка на pastbin теперь мертва. - person se5a; 27.05.2019
comment
Кажется, срок действия pastebin, который я разместил в последний раз, когда кто-то спрашивал, истек. Я должен опубликовать это как следует где-нибудь. - person pagnatious; 27.05.2019