Eu uso a seguinte abordagem (semelhante ao algoritmo de divisão de massa de Tonge http://www.richardtonge.com/ ):
- detectar todos os pares de colisão em sua cena / contexto. Seja (A, B) esse par. Aplique uma ideia de divisão fantasma / massa: se A estiver em contato com M corpos e B estiver em contato com N outros corpos, defina temporariamente a massa de A para
m_A/M
e a de B param_B/N
- calcular contribuições da força de reação / restituição para cada par (A, B) e armazenar essas contribuições nos acumuladores de A e B
- calcular velocidades de restituição de impulsos (como você declarou) e armazená-las da mesma maneira (como resíduos de velocidade deltaV em seus próprios acumuladores para cada par (A, B))
- calcular deslocamentos de penalidade (novamente, acumule deslocamentos, não os aplique instantaneamente!)
- redefinir as massas de todos os corpos previamente designados como partes em pares de colisão (
m_A = m_A * M
e m_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:
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 "