Mover objetos colidindo ao usar prevenção de colisão não alinhada (direção)

9

Estou tendo problemas com a prevenção de colisões desalinhadas pelo que considero um caso raro. Eu configurei dois objetos para se moverem um em direção ao outro, mas com um pequeno deslocamento, para que um deles se mova levemente para cima e um deles se mova levemente para baixo.

No meu algoritmo de direção de prevenção de colisão desalinhado, encontro os pontos na linha de frente do objeto e na linha de frente do outro objeto em que essas duas linhas são as mais próximas. Se esses pontos mais próximos estiverem a uma distância de prevenção de colisões e se a distância entre eles for menor que os dois raios das esferas delimitadoras dos dois objetos, os objetos deverão se afastar na direção apropriada.

O problema é que, no meu caso, os pontos mais próximos nas linhas são calculados para ficarem muito longe do ponto de colisão real. Isso ocorre porque as duas linhas avançadas de cada objeto estão se afastando à medida que os objetos passam. O problema é que, por causa disso, nenhuma direção ocorre e os dois objetos colidem parcialmente.

Captura de tela das linhas de encaminhamento de objetos.

Alguém tem alguma sugestão de como posso calcular corretamente o ponto de colisão? Talvez, de alguma forma, levando em consideração o tamanho dos dois objetos?

James Bedford
fonte
Observe que na captura de tela, as linhas verde, vermelha e azul são apenas os eixos do mundo 3D.
James Bedford

Respostas:

6

Este é de longe o melhor artigo de detecção de colisão bola a bola que encontrei.

Lições do Pool Hall: Detecção de colisão rápida e precisa entre círculos ou esferas

Adam Harte
fonte
Eu sei como fazer um teste de colisão esfera-esfera. Meu problema é tentar encontrar a posição em que essa colisão acontecerá no futuro. Obrigado.
James Bedford
@ James esse artigo resolverá seus problemas. Veja a página 2 e você pode usar um número arbitrariamente alto para a "velocidade" em uma de suas esferas para determinar o ponto de colisão "no futuro".
Tetrad
Ok - desculpe por não dar uma olhada, parece muito bom! Vou ter que voltar para você depois de ler. Obrigado :)
James Bedford
11
Posso esclarecer que, na página 2 da seção "Foto do banco: colisão entre dois círculos em movimento", significa que você deve usar a diferença entre a velocidade dos dois círculos no algoritmo, em vez da velocidade do primeiro círculo? (A velocidade do segundo círculo não é usada na versão estacionária do algoritmo.) Esse bit não estava tão claro para mim. Obrigado.
James Bedford
0

Você não quer encontrar o ponto mais próximo.

Você deseja encontrar o ponto nas linhas em que a distância é igual aos raios combinados das duas esferas.

AttackingHobo
fonte
Ah ok! Você sabe como eu posso descobrir isso matematicamente ..?
James Bedford
0

Se estou entendendo sua pergunta corretamente, você pode simplesmente usar um teste de interseção Sphere vs Sphere, como sugeriu AttackingHobo.

A matemática para fazer esse teste é a seguinte (corrija-me se estiver errado, já faz um tempo). Além disso, isso leva em consideração que suas esferas têm uma variável de centro e raio cada uma.

A fórmula para verificação é mais ou menos assim:

distanceOfSpheres <= sumOfRadii^2

Você tem uma interseção esfera vs esfera. Isso é bem simples, vamos ver como é o código!

bool sphereIntersectTest(BoundingSphere* s1, BoundingSphere* s2)
{
   Vector3 distance;

   // Get the distance between each sphere, center is a Vector3 type
   distance = (s1->center - s2-> center);

   // Determine the sum of both radii
   float radii = (s1->radius + s2->radius);

   // Determine if we have an intersection
   if (distance.length <= (radii * radii))
      return true;
   else
      return false;
}

Mais uma vez, acho que esta é a resposta correta que você pode estar procurando. Se alguém souber que isso está errado, corrija-me, pois já faz um tempo desde que eu fiz essas contas.

joelretdev
fonte
Eu sei como fazer um teste de colisão esfera-esfera. Meu problema é tentar encontrar a posição em que essa colisão acontecerá no futuro. Obrigado.
James Bedford
0

Ok, espero que isso faça sentido ... Pegue os vetores das bolas e calcule seu ponto de colisão, chame isso de p1. Encontre o ângulo entre os 2 vetores, chame isso de a1. Em a1 / 2, desenhe uma linha, que estará no meio exato em graus entre os dois vetores. Você precisa da localização nesta linha em que sin (a1 / 2) = (raio1 + raio2) / 2. Se esta imagem é visualizada na minha cabeça, é aqui que a colisão ocorre. Desculpe se isso está errado ... está atrasado.

Sam
fonte