Как стать автором
Обновить

Комментарии 9

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

Проиллюстрирую проблему на мысленном эксперименте. Есть три шара A, B и C. Шар A и B до момента разрешения коллизий пересекаются друг с другом. C находится в свободном состоянии. После обнаружения коллизии A и B, и ёё разрешения может оказаться, что теперь A или B сталкивается с C. Хотя изначально этой коллизии не было. И это проблема. Причём результат ещё и зависит от того, в каком порядке мы обходим объекты: A -> B -> C или C -> B -> A.

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

Вообще, есть ну очень хороший и доступный материал от Карнеги-Меллона, рекомендуемый к ознакомлению.
https://www.cs.cmu.edu/~baraff/sigcourse/

То что я описал выше подробно описано в лекциях Differential Equation Basics и Particle  Dynamics.

Там есть и про идеальные связи, которые вы пытаетеесь сделать. Лекция Constrained Dynamics.

Но ведь автор производит вычисления итеративно, причём несколько раз за кадр. Правильно ли я понимаю, что с увеличением количества итераций и, соответственно, с уменьшением dt эта проблема также будет "уменьшаться"?

Ну да. Мы можем рассматривать каждую пару как отдельное линейное уравнение, а всю систему как СЛАУ. Тогда последовательное решение каждой коллизии в несколько проходов будет эквивалентно методу итераций для решения СЛАУ.
Но предполагаю, что tony-space предлагает что-то более оптимальное.

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

Спасибо за хороший источник, обязательно попробую.

Решил написать про метод Верле именно из-за его простоты, с оговоркой в начале первой части («некое подобие физического движка»)

Кстати, есть даже реализация на GPU. Не забудьте поиграть с масштабом (ползунок сверху) и физикой (кнопки справа)
https://www.shadertoy.com/view/tstSz7

останится проверить

останЕтся

расскажи, как считать коллизию на GPU

Это сложно, люди научные статьи на эту тему пишут. Вот, например:

https://www.researchgate.net/publication/254098951_GPU-based_parallel_collision_detection_for_fast_motion_planning

Или вот, вроде как здесь более понятным языком написано
https://docs.taichi-lang.org/blog/acclerate-collision-detection-with-taichi

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории