Definindo uma Velocidade Máxima
Dica #5
Dica #5
Essa semana estive pensando em como definir uma velocidade máxima para determinado objeto acelerado.
Intrigante pensar nisso, pois quando criamos um jogo quase nunca levamos isso em consideração... mas é um ponto interessante a se pensar. Afinal, no mundo real, algo que existe ao nosso redor o tempo todo é o arrasto, e tudo é afetado por ele.
Pra quem não sabe, o arrasto define qual será a velocidade máxima de um determinado objeto quando o mesmo é acelerado, e isso não depende da massa do objeto, apenas se o objeto está submetido a um fluido (Como por exemplo, a agua, ou a atmosfera da terra).
Quem propôs isso pela primeira vez foi o Galileu, ele dizia que uma pena e um martelo poderiam cair na mesma velocidade caso não existisse o arrasto, e é algo que foi comprovado quando os humanos foram a lua.
Caso um determinado objeto esteja no vácuo, ele não vai ter arrasto, consequentemente ele não terá velocidade máxima. (Em tese, ele poderia "acelerar infinitamente")
No Unity (Mais especificamente no componente de Rigidbody) temos a propriedade drag.
É ele quem permite que um determinado objeto pare de se mover usando o fator de arrasto dinâmico da física do Unity. Mas por padrão, essa propriedade vem zerada, o que implica que seu objeto não terá velocidade máxima.
Mas, beleza. Até aqui você já deve saber disso. Mas qual é o melhor fator arrasto para nosso caso inicial? Lembre-se, queremos saber a Velocidade Terminal de nosso objeto de acordo com a força que aplicamos nele. E para isso, temos que calcular tudo usando o fixed.deltatime. Afinal, isso é um calculo de física.
Depois de pensar um pouco, podemos chegar nesse conclusão:
Se o fator de arrasto (Drag) for 1, então a velocidade máxima será igual a aceleração máxima aplicado no objeto, então é uma equivalência.
Logo, se pegarmos a aceleração máxima que você vai aplicar sobre seu objeto, e dividir pela velocidade terminal que você quer quer seu objeto tenha, o resultado disso será exatamente o fator de arrasto ideal para seu objeto conseguir chegar na velocidade maxima.
IdealDrag = AceleraçãoMaxima / VelocidadeTerminal
Que no C# do Unity é o mesmo que:
Rigidbody.drag = IdealDrag / (IdealDrag * Time.fixedDeltaTime + 1);
Onde:
Velocidade Terminal : É o Máximo de velocidade que você quer que o objeto tenha.
Aceleração Máxima : Quão forte é a força imposta sobre nesse objeto para chegar na velocidade terminal.
Observe que não precisamos levar em consideração a massa do objeto, apenas o fator de arrasto. Dessa forma, podemos definir para qualquer objeto qual será sua velocidade máxima apenas aplicando uma força.
Exemplo:
Vou aplicar uma força 10 no objeto e quero que ele tenha uma velocidade máxima de 20 metros por segundo:
10 / 20 = 0,5 Drag
Vou aplicar uma força 50 no objeto e quero que ele tenha uma velocidade máxima de 15 metros por segundo:
50 / 15 = 3,33 ou 3* Drag