Continuando a série sobre desenvolvimento de jogos, após verificar a colisão, o próximo passo é entender o que acontece no mundo real durante uma colisão. Como praticamente todos os simuladores de colisão que achei são feitos em java e tem um applet nojento na página, para poder escrever esse post eu criei um simulador de colisão em html usando canvas e javascript, o jscolisao que também tem código aberto.
Disclaimer: Não sou físico e posso escrever alguma besteira aqui, então não use esse material para escola, faculdade e afins, mas use à vontade para seus jogos.
Colisão é um estudo sobre troca de energia e movimento, portanto, quando dizemos que houve uma colisão estamos dizendo que houve uma troca de energia e movimento entre os corpos envolvidos.Voltando ao exemplo do meu jogo, sempre que a bolinha se choca com algum jogador ou parede temos que simular essa troca de velocidade. Neste post vou comentar apenas sobre a colisão na parede, que é mais simples.
Antes de começar a usar o simulador vamos lembrar um detalhe importante sobre colisões, o tipo de colisão. Existem aquelas colisões onde não existe perda de energia e toda a energia do momento da colisão é mantido, como no famoso Pêndulo de Newton, que num mundo ideal funcionaria eternamente, esse tipo de colisão é chamado colisão elástica. O fator fundamental para esse tipo de colisão é o chamado coeficiente de restituição. Imagine a colisão entre o seu pé e uma bola de futebol, no momento que você a chuta ela visivelmente se deforma, acumulando energia, e depois ela volta à forma original de bola, liberando esta energia. Independente de quão visível é a deformação, a energia sempre é transmitida e cada material tem o seu proprio coeficiente de restituição, que nada mais é do que a quantidade de energia que ele consegue propagar. Para descobrir o coeficiente de restituição de um elemento, basta pegar a soma das velocidades após a colisão e dividir pela soma das velocidades no instante da colisão, ou seja, caso não haja perda de velocidade, os números serão iguais antes e depois, resultando num coeficiente de restituição igual a 1.
Para as colisões que o coeficiente de restituição são menores do que 1, significa que houve perda de energia, e pode resultar numa colisão parcialmente elástica, que seria igual a anterior, mas com perda de energia ou uma colisão perfeitamente inelástica, que é quando os corpos se juntam durante a colisão e seguem como um único corpo com a soma das massas após a colisão.
Só por curiosidade, caso o coeficiente seja maior que 1, significa que houve um ganho de energia durante a colisão, o que até onde eu saiba não existe, mas foi retratado no filme infantil Flubber, e pode ser testado no simulador sem problemas.
Além do coeficiente de restituição os outros dados importantes para serem analisados durante a colisão são a massa e a velocidade dos corpos no instante da colisão. Com esses dados na mão basta usar a seguinte fórmula: v1f = (1+e)m2v2i/(m1 + m2) + v1i(m1 – m2 e)/(m1 + m2) onde:
e = coeficiente e restituição
m1 = massa do corpo 1
m2 = massa do corpo 2
v1i = velocidade do corpo 1 no momento da colisão
v2i = velocidade do corpo 2 no momento da colisão
* Como não quero que essa série passe de 3 ou 4 posts, eu vou deixar os detalhes por trás da fórmula da colisão nesse excelente material que encontrei.
Neste instante o foco é na colisão da bolinha com as paredes, então vamos rever esta fórmula. Como estamos trabalhando num mundo ideal vou considerar que o coeficiente de restituição é 1. Além disso, reparem que a primeira parte da fórmula é (1+e)m2v2i/(m1 + m2). Como a velocidade da parede é zero e qualquer coisa multiplicado por zero vai resultar em zero, e zero divido por qualquer coisa também vai ser zero, sempre que o segundo corpo não estiver em movimento antes da colisão, essa primeira parte da fórmula vai ser sempre zero. O que sobra pra nos preocuparmos então é v1i(m1 – m2 e)/(m1 + m2). Mas agora vem um problema, quanto pesa a bolinha? E a parede? Vamos fazer uma simulação simples, imagine que a massa da bolinha é 1 e da parede é 1000. Lembrando que estamos trabalhando com e=1, então vamos ter:
v1f = v1i(1 – 1000 *1) / (1 + 1000) -> v1f = v1i * -999/1001.
Agora vamos imaginar que a bolinha pesa 0.1 e a parede pesa 1000000. Teremos:
v1f = v1i(0.1 – 1000000 *1) / (0.1 + 1000000) -> v1f = v1i * -999999.9/1000000.1.
Na primeira simulação teríamos vf = vi * -999/1001 -> vf = vi * -0.998001998. E na segunda simulação teríamos vf = vi * -0.9999998.
Reparem que quanto maior a diferença entre as massas mais próximo de -1 será este último termo. Logo, quando a massa do corpo 1 é desconsiderável comparada a do corpo 2 teremos que vf = vi * -e. Como estamos trabalhando com e = 1, teremos uma velocidade final que será igual a velocidade do instante da colisão multiplicado por -1. Lembrando que no jogo, eu sempre guardo a velocidade em 2 variáveis diferentes, 1 para o eixo x e uma para o eixo y. Quando bato nas paredes verticais, eu mantenho a velocidade vertical e multiplico a horizontal por -1, e nas paredes horizontais o oposto.
Acho que muita gente que já brincou com este tipo de problema sempre fez a multiplicação por -1, mas poucos realmente entendiam o porquê. Espero que este post tenha esclarecido este outro mistério e não deixem de conferir o material que citei acima, e aguardem o próximo post onde vou resolver o problema da colisão com os jogadores.





