Resolução de colisões de corpos rígidos em 2D
Definição do problema
- Desde o Mario pisando em nuvens até a colisão entre dois carros em um jogo de corrida, lidar com colisões é uma parte muito importante da maioria dos videogames.
- Esta série de posts vai abordar a matemática e a física reais por trás da simulação física.
- Videogames são uma ótima forma de contextualizar esses conceitos e torná-los menos abstratos.
Uma palavra sobre matemática
- Este texto traz bastante matemática, mas a recomendação é não ter medo dela.
- A notação matemática pode parecer complexa, mas a maior parte é aritmética simples.
- A recomendação é encarar o desafio sem medo da matemática.
Antes de começar
Corpo rígido
- Física de corpos rígidos é uma simulação física que lida com objetos que não se deformam.
- Na prática, todo objeto se deforma em nível molecular, mas na simulação isso é simplificado e tratado como corpo rígido.
Detecção de colisão e resolução de colisão
- Detecção de colisão é o processo de verificar quais objetos estão colidindo na cena.
- Resolução de colisão é o processo de determinar como os objetos que colidiram devem se mover.
- Esta série de posts vai se concentrar na etapa de resolução de colisão.
O que vamos fazer?
- A maioria dos jogos roda dentro de um grande loop.
- A cada iteração do loop do jogo, a posição dos objetos é atualizada de acordo com a velocidade atual.
- Velocidade é um vetor com magnitude e direção.
Velocidade
- Velocidade representa a mudança na posição de um objeto ao longo de um certo tempo.
- A nova posição do objeto é calculada somando o deslocamento obtido ao multiplicar a velocidade atual pelo intervalo de tempo.
Resolução de colisão
- O objetivo da resolução de colisão é alterar a velocidade dos objetos após a colisão para que eles não continuem se atravessando.
- A velocidade após a colisão pode ser expressa como a soma da velocidade antes da colisão com a variação de velocidade causada pela colisão.
O que é uma colisão?
- Para verificar se dois objetos estão colidindo, duas condições devem ser atendidas:
- As formas geométricas dos objetos devem estar em contato ou sobrepostas.
- Os objetos ainda devem estar se movendo em direção à colisão.
Normal da superfície
- Para mover um objeto o máximo possível para longe da superfície, ele deve ser movido em uma direção perpendicular à superfície.
- Essa direção é chamada de direção normal e é perpendicular à superfície.
Produto escalar
- Para calcular o quanto dois vetores apontam na mesma direção, usa-se o produto escalar.
- O produto escalar é definido como a soma dos produtos dos elementos correspondentes dos dois vetores.
- Pelo sinal do produto escalar, é possível saber se os dois vetores apontam na mesma direção ou em direções opostas.
Conclusão
- Uma colisão acontece quando um ponto de um objeto entra em contato com um ponto de outro objeto e a velocidade normal relativa é negativa.
- No próximo texto, será abordada a física real por trás da colisão.
Opinião do GN⁺
- Importância da simulação física: na criação de jogos, a simulação física é um elemento importante para aumentar o realismo.
- O papel da matemática: a matemática é o núcleo da simulação física, e entendê-la permite criar simulações melhores.
- A complexidade da resolução de colisão: resolver colisões é um processo mais complexo do que simplesmente atualizar a posição dos objetos.
- Valor educacional: este texto ajuda bastante a compreender os fundamentos da simulação física.
- Aprendizado adicional: implementar um motor físico por conta própria também é uma boa forma de aprender. É possível consultar motores físicos open source como Box2D e Chipmunk.
1 comentários
Comentários no Hacker News
Resumo de comentários do Hacker News
Hey everyone, author here!
Oh! Look, a well-researched, deeply-explained, and interactive post.
One side project I am working on right now is a 2d space shooter I am developing with my son.
I always enjoyed the explanation from the N game: N game tutorial
I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.
This is great. This reminds me of Chris Hecker's Rigid Body Dynamics series from GDMag/Gamasutra that I read (checks watch) almost 30 years ago!
Collisions are violations of the pairwise non-intersection constraint between bodies.
If you want to go further and go for rigid body dynamics and constraint, I found that series of blog post very useful: Toptal blog post
To dredge up a related oldie-but-goodie memory of blog posts: Gaffer on Games
Guess this is a Shameless plug but I wrote an interesting program over 12 years ago using even then very old three Js which is not quite the metal but much less abstract than today's tools.