Como resolver a penetração de dois corpos em colisão

9

Eu implementei um mecanismo simples de física de jogos em 3D. Já tenho uma detecção de colisão decente, agora estou tentando descobrir a parte da resposta à colisão. Estou usando o método baseado em impulso para calcular as velocidades pós-colisão. Isso funciona muito bem, no entanto, não impede completamente a interpenetração dos corpos. Portanto, tenho um código adicional para resolver a penetração. Atualmente, apenas movo os corpos ao longo do contato normal pela metade da profundidade de penetração - primeiro corpo na direção do contato normal, segundo corpo na direção oposta.

Isso é bom na maioria das vezes, mas existem alguns efeitos indesejáveis. Por exemplo, imagine um corredor estreito e um objeto passando por ele. Se o objeto atingir uma das paredes do corredor, a resolução de penetração o moverá para a parede oposta, no próximo quadro novamente para a primeira parede e assim por diante. O efeito é que o objeto vibra muito rápido entre as paredes, o que não é bonito.

Então, minha pergunta é se existe uma maneira melhor de resolver a penetração? Talvez não mova os corpos, apenas ajuste de alguma forma suas velocidades (além da computação por impulso) para que parem de se mover e a penetração se resolva nos próximos dois quadros. Estou apenas adivinhando aqui. Alguma ideia?

Adão
fonte

Respostas:

3

Ao detectar uma colisão, determine em que momento / ponto os corpos começaram a colidir e trate a colisão neste momento. Você ainda pode ter uma pequena penetração para resolver neste momento, mas será muito menor e [normalmente] não produzirá os problemas de oscilação que você está tendo.

Digamos que você tenha etapas de simulação de 100ms e que, em algum quadro, você tenha duas bolas que colidem a meio caminho (50ms) no quadro. Primeiro, você detectará que eles colidiram em qualquer ponto do quadro (o que eu acredito que você já esteja fazendo de maneira eficaz). Eles determinarão em que ponto durante o quadro em que colidiram. Agora lide com a colisão, incluindo os primeiros 50ms do quadro em que não colidiram. Agora você terá as novas velocidades das bolas e também poderá tomar medidas agora para garantir que elas não penetrem (elas devem ser muito pequenas, pois "aconteceu"). Finalmente, você simulará os próximos 50 anos de a moldura. Observe que durante esse período, pode muito bem haver outra colisão com uma ou ambas as bolas.

entalhe
fonte
11
Então, você está basicamente sugerindo implementar a detecção contínua de colisões e lidar com as penetrações ainda deixadas da mesma maneira que eu já faço, pois elas provavelmente serão muito pequenas. Isso poderia funcionar, suponho. Agora eu só tenho que descobrir como fazer o meu detecção de colisão contínua :)
adam
Não tenho certeza do que você quer dizer com contínuo. A rigor, não há nada contínuo na simulação de física, pois tudo é sempre dividido em etapas discretas de tamanho. Tomar medidas menores, que é essencialmente o que eu sugiro, produzirá erros muito menores (e mais fáceis de corrigir). Outra maneira de pensar sobre isso é que existe uma relação direta entre o tamanho da etapa e os erros (como a penetração). Portanto, quando você detectar esse erro, divida em etapas menores até que o erro seja trivialmente corrigível.
Janelas
A detecção contínua de colisões significa que, em vez de verificar a interseção entre dois objetos estáticos (um problema 3d), você verifica o contato de dois objetos em movimento (basicamente, um problema 4d). Normalmente, basta considerar velocidades constantes, porque é possível aproximar as trajetórias com curvas lineares por partes. A vantagem é que a distância de penetração será sempre zero (ou próxima a, devido a erros de arredondamento do flutuador). Eu pensei que você estivesse falando sobre isso, mas talvez eu tenha interpretado mal sua resposta?
adam
@ Adam Sim, é disso que estou falando.
notlesh
2

Confira este artigo - que foi publicado aqui muitas vezes antes, basta pesquisar as perguntas e respostas com a detecção de colisão - mostra como fazer a resolução de colisão "contínua" de que Stephelton estava falando:

http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3

Basicamente, você resolve algumas equações cinemáticas básicas para o ponto no tempo exato quando suas duas caixas delimitadoras começam a se cruzar. Você resolve suas colisões no momento exato e depois prossegue com o tempo restante no seu quadro. Você pode ter que simular novamente o que acontece após o momento da colisão, pois as velocidades / acelerações dos seus objetos terão mudado. Mas aí está o seu ponto de partida ... de qualquer forma!

Mediocritus
fonte
Obrigado, verifiquei o artigo. O problema é que estou usando uma representação diferente dos meus objetos. Estou usando poliedros convexos e testando a colisão usando o teorema do eixo separador. Isso pode ser estendido para lidar com corpos em movimento com velocidades lineares constantes (o que eu sei fazer), mas não faço ideia de como lidar também com velocidades angulares. Mas vou fazer uma pergunta separada se eu decidir seguir esse caminho.
21412 adam