W silniku fizyki rozwijam (do nauki) za pomocą love-2d zaimplementowałem rozwiązania kolizji w następujący sposób:
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
...
Jak widać na końcu animacji gif, następuje zanik FPS, gdy wszystkie zderzaki są prawie uziemione na obiekcie statycznym.
Wynika to z faktu, że liczba rozdzielczości kolizji rośnie, gdy obiekty spędzają więcej czasu na dotykaniu podczas osiadania. Jednak wiele obliczeń jest „bezużytecznych”, ponieważ obiekty już ustabilizowały się względem siebie.
Jaka jest najlepsza praktyka (miejmy nadzieję, że nie wymaga dyplomu fizyki), aby uniknąć tych „bezużytecznych” detekcji kolizji?
Edycja: zaakceptowano wskazówki DMGregory i doszło do tego wyniku (jeszcze nie optymalny)
(Czerwony = statyczny, niebieski = aktywny, zielony = spanie)
2d
collision-detection
physics
optimization
love2d
dnk drone.vs.drones
źródło
źródło
Odpowiedzi:
Podejrzewałem, że OP zna takie podejście, więc wspomniałem o tym w komentarzu jako punkcie wyjścia, ale postaram się je rozwinąć jeszcze trochę ...
Większość silników fizycznych dzieli obiekty dynamiczne na dwie grupy: „ przebudź się ” i „ śpij ”.
Przedmioty śpią, gdy siedzą w spoczynku, i budzą się, gdy są poruszane lub przyspieszane przez wpływ z zewnątrz.
Obiekt śpiący pod wieloma względami zachowuje się jak obiekt statyczny - jego ruch nie jest zintegrowany w czasie (ponieważ jest w spoczynku, więc nie ma ruchu), a silnik ignoruje kolizje między obiektami śpiącymi lub statycznymi.
Obiekt do spania siedzący na nieruchomej podłodze nie spada przez niego, pomimo braku reakcji na kolizję, ponieważ cała integracja ruchu jest pomijana dla obiektów do spania, w tym grawitacji.
Tak więc należy sprawdzić tylko kolizje obejmujące co najmniej jeden przebudzony obiekt dynamiczny:
Może to radykalnie zmniejszyć liczbę obiektów wymagających aktywnej symulacji, zwłaszcza na stosach, które, jak pokazano w pytaniu, mają wiele wzajemnych kolizji, aby sprawdzić niewielki lub zerowy ruch siatki.
Jednak spanie pomaga tylko wtedy, gdy przedmioty rzeczywiście znajdą się w spoczynku, co może chwilę potrwać.
Niektóre rzeczy, które możesz zrobić, aby szybciej dotrzeć do odpoczynku:
Miej niezerową minimalną prędkość lub pęd i ustaw wszystko, co spadnie poniżej zera, na zero. (Jest to w zasadzie epsilon, powszechnie używany do porównywania pływaków)
Użyj tarcia, tłumienia i nieelastycznych kolizji, aby odsysać energię z systemu i pomóc mu szybciej dotrzeć do spoczynku.
Zwiększ tarcie / tłumienie / nieelastyczność wybiórczo dla wolno poruszających się obiektów, aby dać im ostateczny impuls do odpoczynku, bez wpływu na zachowanie bardziej energetycznych ciał.
źródło