Detecção de colisão de inclinação de bola vs 45 graus

8

Eu tenho um jogo simples em que o jogador move uma bola. A bola quica nas paredes. No momento, tenho paredes quadradas (■) implementadas: uso colisões de caixas delimitadoras simples para verificar se o jogador se moverá para uma parede ao atualizar sua velocidade x ou y; nesse caso, multiplico essa velocidade por -1 para fazê-las saltar .

No entanto, também quero implementar peças triangulares (◢◣◤◥). Para recuperar, acredito que se pode simplesmente usar:

   newxspeed = -1*yspeed;
   newyspeed = -1*xspeed;

No entanto, estou tendo problemas com a detecção de colisão: quando o jogador atinge a diagonal?

Qqwy
fonte
2
Eu recomendo o tutorial N ( parte 1 , parte 2 ) sobre este tópico.
Chris Burt-Brown
Muito obrigado. Esse tutorial realmente me ajudou a finalmente entender como resolver isso.
Qqwy
Na verdade, é muito difícil para mim marcar uma das respostas como 'a' solução, pois todas elas me ajudaram a entender o problema, mas nenhuma delas o resolveu completamente. O que devo fazer?
Qqwy

Respostas:

8

Antes de tudo, para calcular a detecção de colisão entre uma esfera (círculo em 2D) e uma linha, você precisa calcular o vetor perpendicular entre o centro da bola em movimento e a linha. Para calcular essa distância, é necessário fazer o seguinte:

insira a descrição da imagem aqui

Portanto, para calcular d na figura acima, precisamos executar algumas etapas.

  1. Suponha que sua linha esteja usando a equação paramétrica P (t) = S + tV, observe que V é a direção da linha que pode ser obtida subtraindo (P2 - P1).
  2. Partida Pitágoras:

d ^ 2 = len ( Q - S ) ^ 2 - len (proj ( Q - S )) ^ 2

Então você expande a equação para obter o seguinte, parece um pouco complicado, mas na verdade não é.

d = sqrt (len ( Q - S ) ^ 2 - len (( Q - S ) ponto V ) ^ 2 / V ^ 2)

Onde Q é o centro do círculo e S é qualquer ponto da linha. Uma vez que a distância é menor que o raio do círculo / esfera, é necessário acionar a resposta de colisão, explicada no próximo ponto.

É incorreto sempre virar o componente x ou y para rebater a bola, o que você precisa fazer é refletir o vetor de velocidade. Para isso, é necessário calcular o vetor normal da superfície e usar esse normal para calcular a reflexão vector usando a seguinte equação

R = 2 * ( V ponto N ) * N - V

onde R é o vetor de reflexão, N é o normal da superfície e V é o vetor de velocidade.

No caso de 45 graus, sua superfície normal será N = (1,1,0) com sinal variável, dependendo de qual direção a face normal (posição ou negativo).

concept3d
fonte
Você usa uma ótima equação. No entanto, é muito difícil seguir alguém que seja novo em vetores. Seria útil se você dividir sua equação em etapas menores.
Qqwy
A propósito, N é um vetor bidimensional ou tridimensional? De onde vem o terceiro valor (0)?
Qqwy
Usei vetores 3D porque presumi que você estivesse usando uma API 3D (e posso estar errado), caso seja verdade, você precisa definir o terceiro componente como 0, mas de qualquer maneira as equações devem funcionar tanto em 2D quanto em 3D (e provavelmente mais altas). dimensões, mas isso realmente não importa). sobre as equações, posso explicar mais, mas preciso de um tempo para editar a resposta.
precisa
11
Eu editei a resposta, espero que faça mais sentido agora. Btw, espero que a stackexchange possa fornecer uma maneira conveniente de escrever fórmulas matemáticas, porque é propenso a dores e erros no momento.
precisa saber é o seguinte
6

Você quer medir a distância entre o centro da sua bola e a parede, então:

insira a descrição da imagem aqui

resolver o sistema que você vê na figura fornecerá as coordenadas do ponto d.

Então, se a distância entre o ponto d e c for menor ou igual ao raio da bola r, haverá uma colisão entre a bola e a parede

Marco
fonte
5

Bolas são na verdade objetos bastante simples para detecção de colisão. Eles colidem com o terreno quando a distância entre o centro da bola e a borda do terreno se torna menor que o raio da bola. A posição do centro da bola deve ser trivial para obter. Encontrar o ponto mais próximo do terreno é geralmente mais complicado e a melhor maneira de fazê-lo depende de como o terreno é representado.

Seu algoritmo para calcular a nova velocidade após saltar de uma inclinação diagonal está incorreto. Inverter as coordenadas x e y fará a bola voltar na mesma direção em que se aproximou da inclinação. Isso é bom se a bola chegar ao terreno de um ângulo reto, mas falhar em outros ângulos. Você desejará negar apenas o componente normal à superfície; por exemplo, ao saltar do teto, você nega y, não x.

Marcks Thomas
fonte
Embora essa resposta não aborde diretamente o problema, +1 por me informar sobre como a resolução de colisão deve ser feita neste caso.
Qqwy