В физическом движке, который я разрабатываю (для обучения) с использованием love-2d , я реализовал разрешение столкновений следующим образом:
FixedUpdate(dt) // I use fixed timestep
foreach collide c1 in allNotStaticColliders
c1.integartePhysic // i.e. apply gravitational force..
foreach collider c2 "near" c1 // "near"= I use spatial hashing
if collide(c1,c2)
resolve collision (c1,c2) // the heavy operation
collison callbacks c1
collison callbacks c2
...
Как вы можете видеть в конце анимации gif, происходит затухание FPS, когда все коллайдеры почти заземлены на статический объект.
Это связано с тем, что количество разрешений столкновений растет, поскольку объекты проводят больше времени, касаясь их при установлении. Тем не менее, многие из расчетов «бесполезны», потому что объекты уже установились в устойчивых положениях друг против друга.
Какова лучшая практика (надеюсь, не требующая степени физики), чтобы избежать этих «бесполезных» обнаружений столкновений?
Редактировать: принимал DMGгоряди намеки и приходи к этому результату (пока не оптимально)
(Красный = статический, синий = активный, зеленый = спящий)
источник
Ответы:
Я подозревал, что OP уже знал этот подход, поэтому я упомянул об этом в комментарии как просто отправную точку, но я попытаюсь изложить это немного подробнее ...
Большинство физических движков делят динамические объекты на две группы: « бодрствующий » и « спящий ».
Объекты спят, когда они сидят в покое, и просыпаются, когда двигаются или ускоряются каким-либо внешним воздействием.
А спящая объект ведет себя как статический объект в большинстве отношений - его движение не интегрируется с течением времени (потому что в состоянии покоя, поэтому он не имеет никакого движения) и игнорирует двигатель столкновений между объектами, которые спят или статическим.
Спящий объект, сидящий на статическом полу, не проваливается сквозь него, несмотря на отсутствие реакции на столкновение, потому что вся интеграция движений пропускается для спящих объектов, включая гравитацию.
Таким образом, необходимо проверять только столкновения, в которых участвует хотя бы один динамический объект:
Это может значительно сократить количество объектов, которые нуждаются в активном моделировании, особенно в кучах, которые, как показано в вопросе, имеют много взаимных столкновений, чтобы проверить, нет ли движения сетки или нет.
Сон помогает только тогда, когда объекты достигают покоя, хотя это может занять некоторое время.
Некоторые вещи, которые вы можете сделать, чтобы быстрее отдохнуть:
Имейте ненулевую минимальную скорость или импульс, и зафиксируйте все, что падает ниже его, до нуля. (Это в основном эпсилон, обычно используемый при сравнении поплавков)
Используйте трение, демпфирование и неупругие столкновения, чтобы откачать энергию из системы и помочь ей быстрее достичь покоя.
Избирательно увеличивайте трение / демпфирование / неупругость для медленно движущихся объектов, чтобы дать им последний толчок к отдыху, не влияя на поведение более энергичных тел.
источник