Colisão Parcialmente Elástica
Como calcular colisão parcialmente elástica sem quebrar seu simulador
A grande maioria dos tutoriais online trata colisão parcialmente elástica como se fosse apenas uma versão "menos perfeita" da elástica, com um coeficiente de restituição jogado na equação e tudo resolvido. Na prática, é muito mais chatinho do que isso. Se você está implementando isso num motor de física ou numa simulação caseira, aqui vai o que realmente funciona, com os problemas que eu encontrei no caminho. Colisão parcialmente elástica é aquela em que parte da energia cinética do sistema é convertida em outras formas — calor, deformação, som — durante o impacto. O coeficiente de restituição (e) varia entre 0 e 1. Se e = 1, é perfeitamente elástica. Se e = 0, é perfeitamente inelástica, os corpos grudam. Entre esses dois extremos está a maior parte das colisões do mundo real, de bolas de tênis a carros batendo em cercas. A equação básica que rege é: e = v' - v' / v - v, onde os termos com apóstrofo são as velocidades pós-colisão. Mas essa fórmula sozinha não resolve nada se você não souber o que fazer com ela dentro de um loop de simulação.
Implementando passo a passo
O primeiro erro que todo mundo comete é aplicar a fórmula do coeficiente de restituição diretamente nas velocidades lineares sem considerar a conservação do momento linear. Você precisa de duas equações simultâneas: conservação de momento e a definição de e. Resolvendo o sistema para duas massas m e m: v' = (mv + mv - me(v - v)) / (m + m) v' = (mv + mv - me(v - v)) / (m + m)
Essas fórmulas funcionam para colisões unidimensionais. Para 2D ou 3D, você precisa decompor os vetores velocidade na normal da superfície de contato primeiro. Projete cada velocidade na normal da colisão, aplique as equações acima nessas componentes normais, e depois recompose com as componentes tangenciais (que permanecem inalteradas se desprezarmos atrito). Aqui está o detalhe que poucos mencionam: a normal da colisão. Em colisões entre formas convexas, ela é o vetor normal à superfície no ponto de contato, apontando de um corpo para o outro. Para círculos/esferas, é simplesmente a direção entre os centros. Para polígonos ou meshes complexos, você precisa do separando axis theorem (SAT) ou de uma biblioteca como GJK para encontrar o ponto de contato e a normal corretos. Tentar improvisar isso leva a artefatos visuais horríveis e energia sendo criada ou perdida do nada.

O problema que eu encontrei (e como resolvi)
Eu estava desenvolvendo um simulador de colisões 2D com dezenas de objetos e o coeficiente de restituição variável por material. Num cenário com várias esferas empilhadas e e = 0.3, observei algo estranho: após alguns segundos, as esferas começavam a vibrar excessivamente e a energia do sistema aumentava ao invés de diminuir. O simulador simplesmente explodiunumericamente. O problema era dupla: substeping insuficiente e o chamado "sticky collision" em objetos com baixo e colidindo múltiplas vezes por frame. Quando e é baixo, os objetos perdem muita energia e ficam literalmente colados à superfície um do outro por vários frames. O solver de restrições entrava em loop, aplicando correções de posição que geravam oscilações amplificadas. A solução foi implementar position correction com um fator de slop (um pequeno threshold de penetração permitido) e clamp na correção de velocidade. Também adicionei substeps: dividi cada frame em 4 sub-passos de física. Isso reduziu os artefatos em cerca de 95% e estabilizou a simulação. O custo computacional aumentou proporcionalmente, mas para 50-100 objetos em tempo real, 4 substeps é manejável.
Dicas técnicas sobre colisão parcialmente elástica
Se você está lidando com colisão parcialmente elástica em produção, considere estes pontos que raramente aparecem em materiais introdutórios: Threshold de aceleração nula: quando a velocidade relativa entre dois objetoscai abaixo de um certo limiar (digamos, 0.01 m/s) e e é baixo, trate a colisão como inelástica e force os objetos a permanecerem em contato sem aplicar mais impulsos de separação. Isso evita micro-vibrações infinitas. Tangential friction acoplado: se houver atrito, as componentes tangenciais das velocidades também precisam ser modificadas. Um modelo simples usa um coeficiente de atrito e aplica impulse tangencial até saturar (lei de Coulomb). Ignorar isso faz objetos escorregarem indefinidamente na superfície de contato, o que parece muito artificial.
E não é constante: em colisões reais, o coeficiente de restituição depende da velocidade de impacto. Bolas de golfe em altas velocidades têm e menor do que em impactos suaves. Se sua simulação cobre uma ampla faixa de velocidades, usar um e fixo vai gerar resultados equivocados. Uma aproximação razoável é modelar e como uma função decrescente da velocidade relativa, tipo e(v) = e / (1 + v), onde é um parâmetro ajustado experimentalmente.

Quando colisão parcialmente elástica não funciona bem
Este modelo assume corpos rígidos. Se você está simulando materiais deformáveis, tecidos, ou fluidos, colisão parcialmente elástica com coeficiente fixo é insuficiente. Nestes casos, métodos baseados em elementos finitos (FEM) ou Smoothed Particle Hydrodynamics (SPH) são mais apropriados, embora muito mais custosos computacionalmente. Outro cenário problemático: colisões com grandes penetrações iniciais. Se a detecção de colisão for grosseira e os objetos já estiverem sobrepostos antes do resolve, qualquer correção de posição baseada em impulso vai produzir resultados erráticos. A qualidade da detecção de colisão (collision detection) é tão importante quanto a qualidade do resolution. Invista em Broad Phase eficiente (spatial partitioning, sweep and prune) antes de chegar na Narrow Phase. Para simulações com muitos objetos e necessidade de performance, considere engines consolidadas como Box2D (2D) ou Bullet (3D). Elas já lidam com a maioria desses edge cases. Reimplementar do zero é viável para aprendizado, mas para produção o tempo de desenvolvimento e debugging costuma superar em muito o ganho de controle.
Resumo técnico
O fluxo de implementação é: detectar colisão calcular normal e ponto de contato decompor velocidades em componentes normal e tangencial aplicar impulso na componente normal usando conservação de momento + coeficiente de restituição aplicar atrito na componente tangencial (opcional) position correction com slop substeps se necessário. Teste com casos conhecidos primeiro: queda de uma bola com e conhecido deve bater a altura de rebate esperada dentro de margem de erro aceitável. Colisão parcialmente elástica parece simples na teoria mas esconde armadilhas numéricas que aparecem apenas sob condições específicas de baixo e, múltiplas col por frame e acúmulo de erro de ponto flutuante. Documentação ruim e tutoriais superficiais fazem muita gente perder dias tentando entender por que sua simulação está instável. O problema quase sempre é position correction mal implementado ou falta de substeping, não a fórmula em si.
Galeria
-
Exemplos De Colisao Elastica -
Gráficosde uma colisãoparcialmente elástica -
Exemplos De Colisao Elastica