Em um mecanismo de física que estou desenvolvendo (para aprender) usando o love-2d , implementei resoluções de colisão desta maneira:
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
...
Como você pode ver no final da animação gif, há uma deterioração do FPS quando todos os colisores estão quase aterrados sobre um objeto estático.
Isso ocorre porque o número de resoluções de colisão aumenta à medida que os objetos passam mais tempo tocando enquanto se acomodam. No entanto, muitos dos cálculos são "inúteis" porque os objetos já se estabeleceram em posições estáveis um contra o outro.
Qual é a melhor prática (espero que não exija um diploma de física) para evitar essas detecções de colisão "inúteis"?
Editar: dicas DMGregory aceitas e chegar a esse resultado (ainda não é o ideal)
(Vermelho = estático, Azul = ativo, Verde = em suspensão)
fonte
Respostas:
Eu suspeitava que o OP já conhecia essa abordagem, por isso mencionei em um comentário apenas como ponto de partida, mas vou tentar aprofundar um pouco mais ...
A maioria dos mecanismos de física divide objetos dinâmicos em dois grupos: " acordado " e " adormecido ".
Os objetos dormem quando estão em repouso e acordam quando são movidos ou acelerados por alguma influência externa.
Um objeto adormecido se comporta como um objeto estático na maioria dos aspectos - seu movimento não é integrado ao longo do tempo (porque está em repouso, por isso não tem movimento) e o mecanismo ignora colisões entre objetos que estão adormecidos ou estáticos.
Um objeto adormecido sentado em um piso estático não passa por ele, apesar da falta de resposta de colisão, porque toda a integração do movimento é ignorada para objetos adormecidos, incluindo a gravidade.
Portanto, apenas colisões envolvendo pelo menos um objeto dinâmico acordado precisam ser verificadas:
Isso pode reduzir drasticamente o número de objetos que precisam de simulação ativa, especialmente em pilhas que, como ilustrado na pergunta, têm muitas colisões mútuas para verificar pouco ou nenhum movimento líquido.
Dormir só ajuda uma vez que os objetos realmente chegar a descansar no entanto, que pode demorar um pouco.
Algumas coisas que você pode fazer para descansar mais cedo:
Tenha uma velocidade ou momento mínimo diferente de zero e fixe qualquer coisa que fique abaixo dele para zero. (Este é basicamente um epsilon, comumente usado na comparação de carros alegóricos)
Use fricção, amortecimento e colisões inelásticas para retirar a energia do sistema e ajudá-lo a descansar mais rapidamente no geral.
Aumente o atrito / amortecimento / inelasticidade seletivamente para objetos em movimento lento para dar-lhes aquele empurrão final para descansar, sem afetar o comportamento de corpos mais energéticos.
fonte