Publicado por: acao11 | Janeiro 27, 2008

Física para jogos :P

Estive lendo, um pouco , Física das corridas. Felizmente, é possível achar a uma função para velocidade final. Consideraremos Fw ( força nas rodas obtida pelo torque do motor ), Fc ( atrito de rolamento ) e Fd ( força de arrasto ). Consideraremos o movimento no plano 2D.

<—– Fw [ Carro ] (Fd + Fc)–>

Suponhamos que Fw não é em função da velocidade nem do tempo e sabemos que Fc é constante.

Assim, temos :

Fw – Fd – Fc = ma = m(dv/dt)

Seja A = Fw – Fc e B = 1/2pACd, onde p é a dens. do ar, A é área frontal e Cd é coef. de arrasto. Sabemos que Fc = CrW, onde W é o peso ( consideraremos que é igualmente distribuido entre as rodas e suponhamos que o W é constante) e Cr é coeficiente.

Assim , temos :

A – Bv² = m ( dv/dt ) <-> dt = m ( dv / ( A – Bv² )

Então :

Integral [ dt ] ( de t0 a t ) = m . integral ( dv / ( A – Bv² ) ) ( de v0 a v )

Integrando e isolando v temos :

v = sqrt ( A / B ) . F [ ( PERIODO * sqrt (A . B ) ) / m + F -1 ( v0 . sqrt( B / A ))]

imagem.jpg

PERIODO = periodo da atualização dos frames em seg.

v0 = velocidade inicial

F(x) = tgh(x) , se |v| < sqrt(A/B)
ou

F(x) = cotg(x), se |v| > sqrt(A/B)

sqrt(x) = raiz quadrada de x

F -1 é a função inverso da F (ou seja arctgh ou arccotg ). Veja a seguir um pequeno trecho do código em Java :

    private double arctanh(double x) {
return ( (0.5) * Math.log( ( 1. + x ) / ( 1. – x ) ) ) ;
}
private double arccotg(double x) {
return Math.atan(1/x);
}
private double cotg(double x) {
return ( 1 / Math.tan(x)) ;
}
     /*
* [veloc_init] = m/s ;
* [dt] = s : PERIODO DE ATUALIZACAO
* [S] = m² : Área fronta
* [m] = kg : massa do corpo
*/
private double calculaVeloc(double F, double veloc_init, double dt, double S) {double a , b ;a = F – Cr * ( m * g ) ;
b = ( 0.5 ) * p * S * Cd ;if ( Math.abs(veloc_init) < Math.sqrt(a/b) ) {
return ( Math.sqrt(a/b) * Math.tanh( ( ( dt * Math.sqrt(a*b) )/ m )  + arctanh(veloc_init * Math.sqrt(b/a)) ) ) ;
} else {
return ( Math.sqrt(a/b) * cotg( ( ( dt * Math.sqrt(a*b) )/ m )  + arccotg(veloc_init * Math.sqrt(b/a)) ) ) ;
}}

Deixe uma resposta

Sua resposta:

Categorias