3 pontos por GN⁺ 2024-05-25 | 1 comentários | Compartilhar no WhatsApp

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:
    1. As formas geométricas dos objetos devem estar em contato ou sobrepostas.
    2. 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

 
GN⁺ 2024-05-25
Comentários no Hacker News

Resumo de comentários do Hacker News

  • Hey everyone, author here!

    • Este é o primeiro texto da série do blog, voltado para quem não é desenvolvedor de jogos ou não tem uma base forte em matemática.
    • É por isso que os conceitos são explicados em detalhes.
    • Perguntas são sempre bem-vindas.
  • Oh! Look, a well-researched, deeply-explained, and interactive post.

    • Ao ver o nome de domínio e o TLD ".ski", achei que fosse o autor de outros textos excelentes, mas era outra pessoa.
    • A qualidade do texto é igualmente excelente.
    • Fiquei curioso sobre o segredo do TLD ".ski".
  • One side project I am working on right now is a 2d space shooter I am developing with my son.

    • Estou desenvolvendo um jogo de tiro espacial 2D com meu filho.
    • Tentei fazer tudo por conta própria, sem usar uma game engine, mas tive dificuldade com o problema de detecção de colisão.
    • No fim, decidi usar Box2D.
    • Mesmo com mais de 20 anos de experiência em desenvolvimento e formação em matemática, percebi que subestimei o problema.
  • I always enjoyed the explanation from the N game: N game tutorial

    • Sempre gostei da explicação do N game, da época em que Flash estava no auge.
  • I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.

    • Diverti-me criando uma demo em TypeScript sobre esse tema, com bolas que quicam e colidem.
    • Aprendi muito.
    • Código
    • Resultado/demo
  • 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.

    • Colisões são violações da restrição de não interseção par a par entre corpos.
    • A força de colisão é o multiplicador de Lagrange dessa restrição.
    • A normal de colisão é a derivada parcial da função de restrição.
  • 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

    • Se você quiser se aprofundar em dinâmica de corpos rígidos e restrições, achei essa série de posts muito útil.
  • To dredge up a related oldie-but-goodie memory of blog posts: Gaffer on Games

    • Isso também me fez lembrar de outra série clássica de posts relacionados.
    • 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.

    • Talvez isso seja uma autopromoção descarada, mas escrevi um programa interessante há mais de 12 anos usando o three.js, que já era bem antigo mesmo naquela época.
    • Não é tão low-level, mas é bem menos abstrato do que as ferramentas de hoje.
    • Busy Boxes