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?

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.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.