Обнаружение коллизий между ускоряющимися сферами

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

Повторяющееся моделирование перемещения, которое я использую, в основном следующие:

(Примечание: 3D Векторами являются ВСЕ ЗАГЛАВНЫЕ БУКВЫ.)

For each obj

    obj.ACC = Sum(all acceleration influences)

    obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2     (*EQ.2*)

    obj.VEL = obj.VEL + (obj.ACC * dT)

Next

Где:

obj.ACC is the acceleration vector of the object
obj.POS is the position or location vector of the object
obj.VEL is the velocity vector of the object

obj.Radius is the radius (scalar) of the object

dT is the time delta or increment

То, что я в основном должен сделать, должно найти некоторую эффективную формулу, которая происходит из (EQ.2) выше для двух объектов (obj1, obj2), и скажите, сталкиваются ли они когда-нибудь, и если так, в какое время. Мне требуется точное время оба так, чтобы я мог определить, находится ли это в этом конкретном инкременте времени (потому что ускорение будет отличаться в различных инкрементах времени), и также так, чтобы я мог определить точное положение (который я знаю, как сделать, учитывая время),

Для этого механизма я моделирую все объекты как сферы, вся эта формула/алгоритм должна сделать, должен выяснить в какой точки:

(obj1.POS - obj2.POS).Distance = (obj1.Radius + obj2.Radius)

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

(да, я знаю о многих, многих других вопросах об обнаружении коллизий, однако, их решения, все, кажется, очень конкретны к их механизму и предположениям, и ни один, кажется, не соответствует моим условиям: 3D, сферы и ускорение, примененное в инкрементах моделирования. Сообщите мне, неправ ли я.)


Некоторые разъяснения:

1) Это не достаточно, чтобы я проверил на Пересечение этих двух сфер прежде и после инкремента времени. Во многих случаях их скорости и изменения положения далеко превысят их радиусы.

2) РЕ: эффективность, я не нуждаюсь в помощи (в этой точке так или иначе) относительно, определяют вероятных кандидатов на коллизии, я думаю, что мне покрыли это.


Другое разъяснение, которое, кажется, подходит много:

3) Мое уравнение (EQ.2) возрастающего перемещения является квадратным уравнением, которое применяет и Скорость и Ускорение:

obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2

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

obj.POS = obj.POS + (obj.VEL * dT)

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

7
задан RBarryYoung 25 July 2019 в 14:21
поделиться

3 ответа

На веб-странице, о которой упоминается А.Шелли, разработан метод ближайшей точки сближения для случая двух объектов, движущихся с постоянной скоростью. Однако я считаю, что тот же метод векторного исчисления может быть использован для получения результата в случае двух объектов, движущихся с постоянным ненулевым ускорением (квадратичная временная зависимость).

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

Конечно, это даст вам только момент ближайшего приближения . Вам нужно будет проверить расстояние в этот момент (используя что-то вроде уравнения 2). Если он больше, чем (obj1.Radius + obj2.Radius) , его можно не учитывать (т. Е. Без коллизии). Однако, если расстояние меньше, это означает, что сферы сталкиваются до этого момента. Затем вы можете использовать итеративный поиск, чтобы проверить расстояние в более раннее время. Также можно было бы придумать другой (даже более сложный) вывод, который учитывает размер, или возможно найти какое-то другое аналитическое решение, не прибегая к итеративному решению.

Редактировать : из-за большего В порядке, некоторые из решений уравнения на самом деле являются моментами наибольшего разноса . Я верю, что во всех случаях либо одно из трех решений, либо два из трех решений будут временем самого дальнего разделения. Вы можете аналитически проверить, находитесь ли вы на минимальном или максимальном уровне, оценив вторую производную по времени (при значениях t, которые вы нашли, установив первую производную равной нулю):

D '' (t) = 3 * | D_ACC | ^ 2 * t ^ 2 + 6 * точка (D_ACC, D_VEL) * t + 2 * [| D_VEL | ^ 2 + точка (D_POS, D_ACC)]

Если вторая производная оценивается как положительное число, тогда вы знаете, что расстояние является минимумом, а не максимумом для данного времени t.

5
ответ дан 7 December 2019 в 03:16
поделиться

Проведите линию между начальным и конечным положением каждой сферы. Если полученные отрезки линии пересекаются, сферы определенно столкнулись в какой-то момент, и некоторые умные математические вычисления могут найти, в какое время произошло столкновение. Также убедитесь, что минимальное расстояние между сегментами (если они не пересекаются) меньше 2 * радиуса. Это также будет указывать на столкновение.

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

Рассматривали ли вы использование библиотеки физики, которая уже работает? Многие библиотеки используют гораздо более продвинутые и более стабильные (лучшие интеграторы) системы для решения систем уравнений, с которыми вы работаете. На ум приходит Bullet Physics .

2
ответ дан 7 December 2019 в 03:16
поделиться

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

1
ответ дан 7 December 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: