Обнаружение столкновения для быстро летающих мелких объектов
Я хочу смоделировать быстрое движение частиц, которые более чем в два раза меньше расстояния межкадрового промежутка, который они проходят. рассмотрим следующую ситуацию: 3 частицы одинакового радиуса движутся с одинаковой скоростью к точке в центре. с кодом вроде
for(i..)
for (j..)
check_if_ith_collides_with_jth();`
в своей самой простой реализации система, вероятно, будет вести себя следующим образом:
Но то, что должно произойти, - это особый случай отскока, когда 3 (или более) частиц сталкиваются одновременно:
Я хочу решение для любого количества частиц. Как это обычно решается? Я могу показать еще более сложный случай с 4 частицами:
это возможно покрыть внутри фиксированной, большей рамки?
1 ответ
Определите "время". Я мог бы неправильно понять некоторые из них с вашей точки зрения, и не уверен, имеет ли отношение к этому размер кадра. Я уже реализовывал физические симуляции многочастичного отслеживания столкновений и уже сталкивался с этим типом проблем. Во-первых, вы должны спросить себя, принесут ли вам выгоды все одновременные столкновения для этого конкретного приложения.
В своем ответе я предполагаю, что это своего рода симулятор, управляемый дискретными временными событиями, когда частицы выдвигаются вперед по их траекториям и тест на столкновение применяется ко всем парам. CPA = ближайшая точка приближения.
Одна точка зрения может заключаться в том, что существует минимальная полоса ошибок по времени обнаружения, и вы можете найти большое количество пар, которые "сталкиваются одновременно" относительно этой полосы ошибок. Таким образом, на любом этапе их тестирования вы можете взять все пары, у которых расстояние CPA в пределах порога и прогнозируемое время CPA в пределах current_time +/- error. Это поймает все пары, которые соответствуют вашему критерию. Это настраивается, и разные пороговые значения для времени и расстояния CPA приведут к разному количеству пар для одинаковых начальных условий.
Вторая точка зрения заключается в том, что из-за ошибок этот уровень информации бесполезен для отслеживания этого, и вы можете просто взять первую пару, с которой столкнулись, продолжить сим и поймать остальных на следующем проходе. Без некоторых сдержек и противовесов вы можете пропустить несколько таких, которые будут "проходить" друг через друга, но это можно исправить, отрегулировав размер шага и реализовав некоторую логику для проверки результатов.
Если бы вы реализовали вещи по второму предложению, тогда установка симметричного тестового примера обязательно "не смогла бы" воспроизвести теоретический результат, но опять же, это не значимый тест.
Тот же тип рассуждений применяется к трем или более частицам, сталкивающимся в одном и том же месте и в одно и то же время. Если вы не настроите симметричный тестовый пример, это вряд ли произойдет, и если ваша симуляция будет применена к чему-либо в реалистичной ситуации, "шум" избавит вас от необходимости заботиться об этом уровне точности. Реализация первого предложения может привести к конкретным случаям, которые вы предоставили, но также может предсказать столкновение с несколькими частицами, когда оно действительно не произошло.
CPA обычно применяется к прямолинейному движению с постоянной скоростью ускорения, но аналогичные концепции могут применяться к более сложным ситуациям, особенно если размеры шагов малы, вы можете принять приблизительное значение CPA в пределах временного шага или просто проверить расстояние между парами по порог.