En principio, la escala de tiempo adecuada depende de lo que experimente el jugador. ¿Desea que sea precisa en la escala de tiempo de las semanas y que el jugador interactúe con ella en tiempo real? Eso es mucho más difícil que hacer que funcione en la escala de tiempo que el jugador experimenta muchas veces en tiempo real ( es decir, un segundo de experiencia del jugador es una semana de tiempo real).
mklingen
si está simulando movimientos de nubes o variables termodinámicas en celdas de cientos de metros de ancho, con un dt de 10 minutos, es razonable. pero cuerpo rígido a escalas habituales, no demasiado. cual es la aplicación
v.oddou
La aplicación es una mecánica de "recuperación" donde se ejecuta la simulación desde la última carga (de una parte del mundo), la lógica del juego se basa en la devolución de llamadas donde las devoluciones de llamada son temporizadores o devoluciones de colisión, quiero poder ejecutar la física al siguiente temporice la devolución de llamadas de manera eficiente y haga que la simulación física se ocupe de las devoluciones de llamadas de colisión de llamadas Las colisiones son relativamente poco probables, pero me gustaría que las devoluciones de llamada de colisión tengan un estado de juego (física) disponible en el momento de la colisión.
fread2281
Respuestas:
5
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 v0y s0de 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.
He actualizado la respuesta para incluir estrategias para manejar colisiones.
MichaelHouse
Esto es falso. Se sabe que la integración de Euler se desvía para integraciones constantes, mientras que Verlet (o RK2, RK4) no.
v.oddou
@ v.oddou Teniendo en cuenta que estas simulaciones son para juegos, no creo que sea necesaria la precisión que necesita. La complejidad adicional y la dificultad de agregar colisiones para Verlet hacen que la integración de Euler sea una opción superior.
MichaelHouse
2
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 dthace más y más pequeña, nuestra simulación se vuelve más y más precisa (aunque si dtes 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 dtsu simulación puede manejar para obtener resultados lo suficientemente buenos. Y si lo dtque entra es demasiado grande, simplemente divida la simulación en pasos más pequeños, donde cada paso es el máximo dtpermitido.
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 ){constfloat 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 ...
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.
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
ys0
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.
fuente
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.
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 sidt
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 lodt
que entra es demasiado grande, simplemente divida la simulación en pasos más pequeños, donde cada paso es el máximodt
permitido.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.fuente
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 ...
fuente