Como separar objetos em colisão sem criar mais colisões

11

Suponha que eu use um sistema simples de detecção de colisão discreta, onde movo todos os objetos e depois procuro por colisões. Eu quero que todos os objetos em colisão sejam separados (é claro) e tenham velocidades de resposta apropriadas (salto, deslize, parada, etc.).

Quando tenho um par de objetos colidindo, como os separo sem terminar com um ou ambos colidindo com outros objetos?

AJM
fonte

Respostas:

8

Este não é um problema fácil de resolver em geral. Em um mecanismo de física, ele seria tratado pelo solucionador de contra-impressão. Existem muitos tipos diferentes de solucionadores de restrições, mas um dos mais fáceis de entender é um solucionador de impulsos seqüencial.

Erin Catto deu uma boa explicação de um solucionador de impulsos sequencial em vários GDCs anteriores; eles podem ser baixados na página de download do Box2D , veja o GDC 2009, por exemplo.

Niall
fonte
Estou curioso sobre isso. Dado o quão comum é a necessidade de detecção e resolução de colisões, presumi que haja pelo menos um algoritmo de resolução simplista adequado para jogos de arcade e ação.
AJM
2
Na verdade não. Antigamente (SNES, etc), eles enfrentavam problemas redondos como esse com alterações ou compromissos no design do jogo. Por exemplo. Em Super Mario, quando o jogador era atingido, Mario seria invencível por alguns segundos para contornar as segundas colisões. No Double Dragon, as colisões são ignoradas pelo jogador até que a animação para cair para trás termine.
yaustar
@yaustar Na verdade, Mario não tem colisão com inimigos. Ele só sofre danos quando sua caixa de acerto os sobrepõe.
Inverno
3

A única maneira de impedir que isso aconteça é impedir a penetração em primeiro lugar. Antes de mover um objeto, verifique se é um movimento legal. Observe que isso significa que você deve mover seus objetos um de cada vez para evitar que dois objetos se movam um contra o outro.

Se não ocorrer penetração, você não precisará redefinir nenhuma posição e, portanto, não ativará nenhuma penetração secundária.

Loren Pechtel
fonte
2

O que eu costumo fazer é o seguinte:

Quando você separa objetos e acaba com mais colisões, basta iterar novamente, até que uma quantidade máxima de etapas seja alcançada ou os objetos penetrem menos que um limite predefinido.

noio
fonte
Isso é extremamente instável. O FPS no seu jogo pode aumentar sempre que o jogador faz uma bagunça empurrando objetos leves. Seria melhor resolvê-lo no próximo quadro.
Inverno