Estou tentando descobrir como determinar a direção em que uma colisão ocorre entre dois retângulos.
Um retângulo não se move. O outro retângulo tem uma velocidade em qualquer direção. Quando ocorre uma colisão, quero poder definir a posição do retângulo em movimento para o ponto de impacto.
Parece que estou decidido a determinar em que direção o impacto ocorre. Se estou me movendo estritamente vertical ou horizontalmente, gerencio uma ótima detecção. Mas ao se mover nas duas direções ao mesmo tempo, coisas estranhas acontecem.
Qual é a melhor maneira de determinar em que direção ocorre uma colisão entre dois retângulos?
c#
xna
collision-detection
jgallant
fonte
fonte
Respostas:
tl; dr A solução é mover e verificar colisões, um eixo por vez .
Eu tive esse mesmo problema. Aposto que a fase de atualização do loop do seu jogo é mais ou menos assim:
O truque aqui é mover e verificar colisões, um eixo por vez. Como você disse: "Se estou me movendo estritamente vertical ou horizontalmente, gerencio uma ótima detecção". Então você já resolveu 99% do problema. Apenas mude sua lógica para ficar assim:
Em casos simples, não importa qual eixo você faz primeiro. Se você não se sente bem ao escolher um ou outro arbitrariamente, é razoável verificar primeiro o eixo em que a velocidade absoluta do objeto é a maior.
fonte
De acordo com a resposta de larsbutler, em casos simples, não importa se você verifica primeiro as colisões x ou y. No entanto, isso pode levar rapidamente à imprecisão, mais tarde no caminho (especialmente com formas mais complexas, maiores velocidades e mais objetos).
Se alguém estiver interessado em implementar um algoritmo de detecção de colisão mais sofisticado, aqui está um resumo do que é necessário:
Espero que isso ajude alguém.
Específico à pergunta de Jon:
A etapa que está faltando no algoritmo de colisão é a etapa 4. Pelo que entendi, seus retângulos se cruzam na diagonal e acabam recebendo dois pontos de colisão (um na horizontal e outro na vertical). Determinar qual ponto de colisão ocorreu primeiro depende realmente do que você está usando para a integração da física.
Pela sua descrição, parece que os retângulos não giram e coisas como forças diferenciais parciais não são motivo de grande preocupação. Se for esse o caso, descobrir qual borda colide primeiro é bastante simples. Aqui está algum pseudo-código:
fonte