Estou escrevendo um mecanismo de física 2D em javascript para que eu possa aprender mais sobre física em videogames. Eu o faço funcionar corretamente para colisões rígidas de corpos, exceto se algum corpo colidir com dois ou mais corpos ao mesmo tempo.
Atualmente, para cada par de corpos em colisão (A, B), modifico suas velocidades e velocidades angulares com base no impulso de colisão e as deslizo uma para a outra para que não penetrem. Porém, a detecção de colisões e os cálculos de impulso para outras colisões envolvendo A estarão errados.
Que abordagens posso explorar para que meu mecanismo funcione para mais de 3 objetos colidindo?
Respostas:
Eu uso a seguinte abordagem (semelhante ao algoritmo de divisão de massa de Tonge http://www.richardtonge.com/ ):
m_A/M
e a de B param_B/N
m_A = m_A * M
em_B = m_B * N
)Essa abordagem é semelhante à maneira como o algoritmo iterativo de Jacobi funciona com sistemas lineares simultâneos de equações. E não é garantido que converja, mas no meu simulador ele faz o trabalho sem problemas .. em 3D (sim, uma dimensão extra acrescenta o dobro da dificuldade!).
Advertência : corrija as posições e velocidades somente após o término da fase de detecção / manuseio de colisão! Dessa forma, você atualiza simultaneamente seus atores que colidem. Além disso, as forças de restituição devem ser levadas em consideração na próxima vez em que você integrar posições e velocidades.
EDIT: Bem, acho que você está usando o método de integração Verlet já abusado (esse se tornou um nome familiar entre os entusiastas do gamedev). Neste espectro de manipulação e integração de colisões, você pode dar uma olhada aqui .
ATUALIZAÇÃO: Algumas das informações sobre como abordar a colisão (e a auto-colisão por essa questão de fato) podem ser encontradas nestes documentos:
Um artigo um tanto simples sobre resolução de colisões rígidas por meio de métodos baseados em impulso: http://web.archive.org/web/20060925200136/http://i31www.ira.uka.de/docs/PaperFinal.pdf
Hastes elásticas inextensíveis com fricção torcional com base no multiplicador de Lagrange
A abordagem que propus não é, de longe, uma contribuição original, muitos jogos a utilizam com resultados plausíveis e foi melhor empregada por Jakobsen em seu mecanismo de jogo Hitman.
De uma experiência um tanto prática, as forças de penalidade (semelhantes às molas lineares ou exponenciais que obtêm sua contribuição da distância de penetração) não resolvem adequadamente as penetrações quando outras forças dos corpos que colidem conseguem ser maiores que elas. Foi por isso que escolhi combinar três abordagens (quase redundantes): forças de reação newtonianas (você empurra a parede, a parede empurra para trás), velocidades derivadas de impulso (bolas de sinuca colidindo) e um "natural" afasta geometricamente os corpos uns dos outros "solução. Juntos, eles parecem fornecer tudo: livrar-se da maioriaartefatos de interpenetração feios, corpos em colisão tendem a interagir um com o outro a longo prazo (devido a velocidades e forças de restituição - pelo menos as forças que tendem a arrastar os corpos em um cenário de colisão são canceladas e os corpos se afastam) . Por fim, para entender melhor esses conceitos simples, mas comuns, sugiro analisar esses slides .
Meu epíteto de "método abusado", que descreve as etapas de integração do Verlet, visa uma crença na cultura popular de que este é o Santo Graal dos métodos de integração. É apenas marginalmente melhor do que seu primo simplético de Euler (também chamado por alguns Euler semi-implícito). Existem métodos de integração muito mais complicados (e todos ostentam o nome implícito). Poderosos mecanismos de jogo os utilizam, mas os desenvolvedores independentes não têm tempo para experimentar com eles, pois o Verlet, quando ajustado a um cenário específico, realmente faz maravilhas. Além disso, não há absolutamente nenhum método de integração que possa lidar com restrições rígidas sem envolver um pouco de trapaça (não é possível encontrar o link, mas o documento ao qual estou me referindo deve ser chamado "X.Provot -" Restrições à Deformação em uma Massa modelo para descrever comportamento rígido de tecido "
fonte
Sugiro que, em vez de mudar as velocidades, você altere as forças que atuam sobre um objeto. Não os "cutuque", faça-o sem problemas e utilizando o código já existente. Ao fazer isso, os corpos não mudam imediatamente (e rapidamente, suponho) suas velocidades.
Confira Box2DJS para um exemplo: http://box2d-js.sourceforge.net/index2.html .
fonte
Resolvi analiticamente a equação de impulso para grupos de corpos em colisão. O único problema que enfrentei foi a falta de variáveis para encontrar força relativa de interação entre os contatos de um grupo, que eu preenchi com a profundidade da interseção dos corpos.
A solução para contatos de grupo não é muito mais difícil que o contato único. Infelizmente, perdi um trabalho com cálculos, impossibilitado de compartilhá-lo aqui.
Edit: Provavelmente eu vim com algo assim /physics/296767/multiple-colliding-balls
fonte