Eu tenho uma caixa delimitadora no meu personagem, sua posição no quadro anterior e o quadro atual. A caixa delimitadora é alinhada ao eixo.
Meu personagem está correndo dentro de uma caverna, tenho uma lista de pontos (linhas) que representam a parede da caverna (não alinhada ao eixo)
Eu tenho um algoritmo de granulação grossa que me diz quando alguma parte do meu personagem provavelmente colidiu com alguma parte da parede da caverna.
Eu não tenho um algoritmo de granulação fina para me dizer especificamente qual linha da parede foi colidida e em que ponto.
Meu pensamento atual era que eu poderia criar uma linha para cada canto da caixa delimitadora, da posição no quadro anterior até a posição no quadro atual e, em seguida, testar cada uma dessas linhas para interseções com qualquer uma das linhas da caverna parede.
Meu google fu, no entanto, não me mostrou uma fórmula fácil para calcular cruzamentos. Eu escolhi uma maneira ruim de fazer isso ou sou apenas ruim na pesquisa?
Meu jogo é escrito em scala, no entanto, eu posso ler / traduzir praticamente qualquer linguagem de estilo c e muitas linguagens de script, o que você quiser responder
fonte
Você pode fazer isso com diferentes abordagens;
segmento vs segmento usando linhas paramétricas mais algumas verificações (porque as linhas não são segmentos).
segmento vs caixa
segmento vs círculo (este seria o meu favorito)
. Mas, como você solicita um teste de interseção de segmento versus segmento, aqui está um pseudo exemplo de C ++ extraído do livro muito interessante "Detecção de colisão em tempo real":
O contrato de licença de software do livro solicita a inclusão do seguinte crédito para usar os exemplos de código:
exemplo de código "da Real-Time Collision Detection, de Christer Ericson, publicado pela Morgan Kaufmaan Publishers, © 2005 Elvesier Inc"
fonte
Embora alguém já tenha fornecido uma resposta considerada satisfatória, não tenho certeza de que o método que você descreveu produzirá um tempo de impacto preciso (TOI). Minha primeira inclinação é a de encontrar uma resposta exata para a pergunta: "até onde o jogador pode se mover antes de colidir com uma parte da caverna, se ocorrer alguma colisão?" requer o recurso a técnicas contínuas de detecção de colisão (CCD).
Especificamente, existe uma técnica pela qual você pode "encolher" efetivamente seu AABB em um único ponto e, ao mesmo tempo, "aumentar" os segmentos de linha da caverna na mesma quantidade usando a adição de Minkowski. Então, o problema pode ser visto como lançar um raio contra um objeto convexo ou conjunto de objetos convexos (uma vez que um ponto que se move no tempo com velocidade constante se torna um raio). A primeira distância ao longo do raio que cruza com a caverna "inchada" representará o primeiro tempo de impacto (TOI).
A literatura mais comum sobre como realizar isso lida com três dimensões, mas ainda se aplica a duas dimensões e deve ser transferida facilmente. No momento, não tenho tempo para detalhar todos os detalhes ou fornecer o código psuedo, mas talvez alguém possa verificar e expandir o que estou me referindo. Por enquanto, aqui estão alguns documentos que explicam o processo e alguns termos que você pode estar interessado em pesquisar no Google.
"Fundição com raios contra objetos convexos gerais com aplicação para detecção contínua de colisões", de Gino van den Bergen http://www.bulletphysics.com/ftp/pub/test/physics/papers/jgt04raycast.pdf
"Passagem dinâmica de BSP em mudança de plano", de Stan Melax (BioWare) http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.9.5036
Obstáculo no espaço de configuração (CSO)
Adição de Minkowski
fonte
Em uma tentativa de ajudar outras pessoas que encontrarem isso em suas viagens, aqui está um teste de interseção de linha 2D usando os métodos encontrados em https://stackoverflow.com/a/1968345/431528 .
fonte