¿Qué métodos de simulación física son más adecuados para un tiempo delta realmente grande (horas a semanas)?
Además, ¿tendría problemas para combinar diferentes métodos para tiempos delta grandes y pequeños?
¿Qué métodos de simulación física son más adecuados para un tiempo delta realmente grande (horas a semanas)?
Además, ¿tendría problemas para combinar diferentes métodos para tiempos delta grandes y pequeños?
Respuestas:
Es probable que esté utilizando una aceleración constante para estos grandes períodos de tiempo (que podría ser la aceleración cero). La derivada de la aceleración constante con respecto al tiempo es 0. Eso significa que no cambia con respecto al tiempo, por lo que no importa qué tan grande sea su tiempo delta.
Esta pequeña integración con respecto al tiempo proporciona las ecuaciones que necesita.
a = a
v = at + v0
s = .5at^2 + v0*t + s0
Donde: a = aceleración, v = velocidad, v0 = velocidad inicial, s = posición, s0 = posición inicial, t = tiempo
Con esta estrategia, puede usar intervalos de tiempo de milisegundos a semanas si lo desea. Combinarlos se ocuparía de los parámetros v0
y s0
de la ecuación.
Para manejar las colisiones, deberá implementar estrategias similares a las utilizadas para objetos pequeños de alta velocidad . Primero calculando la nueva posición usando la ecuación anterior, luego barriendo entre la posición antigua y la nueva para todos los objetos. Dado que cualquiera de esos objetos podría haberse cruzado entre sí (minutos o días antes), esto puede volverse muy complejo. Es probable que, dado que tiene tiempos delta tan grandes, es de esperar que tenga suficiente tiempo para procesar estas posibles colisiones.
Tomemos un ejemplo con la gravedad.
En la siguiente función, supongamos que tenemos variables de miembros de clase para posición y velocidad. Necesitamos actualizarlos debido a la fuerza de gravedad cada dt segundos.
void update( float dt )
{
acceleration = G * m / r^2;
velocity = velocity + acceleration * dt;
position = position + velocity * dt;
}
A medida que se dt
hace más y más pequeña, nuestra simulación se vuelve más y más precisa (aunque si dt
es demasiado pequeña, podemos encontrar errores de precisión al agregar números pequeños a números grandes).
Básicamente, debe decidir el máximo que dt
su simulación puede manejar para obtener resultados lo suficientemente buenos. Y si lo dt
que entra es demasiado grande, simplemente divida la simulación en pasos más pequeños, donde cada paso es el máximo dt
permitido.
void update( float dt )
{
acceleration = G * m / r^2;
velocity = velocity + acceleration * dt;
position = position + velocity * dt;
}
// this is the function we call. The above function is a helper to this function.
void updateLargeDt( float dt )
{
const float timeStep = 0.1;
while( dt > timeStep )
{
update( timeStep );
dt -= timeStep ;
}
update( dt ); // update with whatever dt is left over from above
}
Entonces, con esta estrategia, puedes ajustarte timeStep
a la fidelidad que necesites (hacer que sea un segundo, minuto, hora o lo que sea necesario para obtener una representación precisa de la física.
La mayoría de los juegos tienden a utilizar el método simple de integración hacia adelante de Euler (es decir, integrar la velocidad en la posición con el tiempo e integrar la aceleración en la velocidad). Desafortunadamente, el método de Euler solo es adecuado para escalas de tiempo muy pequeñas y tiradas cortas.
Existen métodos más complejos que son más precisos en escalas de tiempo muy largas. El más popular y más fácil de implementar es quizás Runge-Kutte-4 . RK4 determina la posición en el futuro muestreando cuatro posiciones y velocidades en el pasado e interpolando. Tiende a ser mucho más preciso que el método de Euler en escalas de tiempo más largas, pero es más costoso computacionalmente.
Por ejemplo, si desea calcular la física de un planeta en órbita real que se actualiza cada pocos días en tiempo real, el método de Euler hará que el planeta se dispare al espacio después de unas pocas órbitas debido a errores numéricos. RK4 generalmente mantendrá al planeta orbitando en aproximadamente la misma forma muchas miles de veces antes de acumular demasiado error.
Sin embargo, implementar colisiones en RK4 puede ser muy desafiante ...