RK4, Derivados, Comprender la física del juego

8

Gafferon Games tiene un gran artículo sobre la integración RK4 para construir simulaciones físicas que se puede encontrar aquí: Conceptos básicos de integración

Personalmente, mis conocimientos de matemáticas y física podrían mejorar. Me siento cómodo en el ámbito de las matemáticas vectoriales, trigonométricas, algunas estadísticas (he tenido que usar fórmulas de regresión de líneas lineales para software, etc.), y básicamente la mayoría de las cosas desde el nivel secundario hasta la universidad de primer año.

Ahora a la pregunta, leí este artículo, descargué la fuente asociada y depuré línea por línea para tratar de comprender lo que está sucediendo y todavía siento que claramente no entiendo lo que estoy viendo. He buscado en Internet tratando de encontrar las versiones "Para Dummies", francamente aprendo un poco diferente y mirando las fórmulas todo el día con el énfasis en la memorización no va a ser suficiente, ya que necesito entender lo que está sucediendo, así que puede ser flexible aplicándolo.

Así que esto es lo que creo que entiendo hasta ahora, pero espero que alguien más pueda aclararme o corregirme por completo. El RK4 usa un paso de Euler, luego basa eso para avanzar en el tiempo para calcular varios pasos más esencialmente de Euler (?) Y determina, utilizando una suma ponderada, ¿cuál es la mejor posición y velocidad para el siguiente cuadro?

Además, ese método de aceleración (convertido en AS3):

private function acceleration(state:State, time:Number):Number
{
    const k:int = 10;
    const b:int = 1;
    return - k*state.x - b*state.v;
}

toma una masa constante (10) y una fuerza (1)? y devuelve un cálculo extraño No tengo idea de por qué ...- masa * posición - fuerza * velocidad? ¿Qué?

Luego, para mi último poco de confusión, en los métodos de evaluación que se parecen a (AS3):

private function evaluateD(initial:State, time:Number, dtime:Number, d:Derivative):Derivative
{
    var state:State = new State();
    state.x = initial.x + d.dx*dtime;
    state.v = initial.v + d.dv*dtime;
    var output:Derivative = new Derivative();
    output.dx = state.v;
    output.dv = acceleration(state, time+dtime);
    return output;
}

Almacenamos un nuevo estado con el paso de tiempo, luego configuramos una derivada para que regrese ... Entiendo esto como se usa en el proceso de aproximación, ¡pero qué es esto !:

output.dx = state.v;
output.dv = acceleration(state, time+dtime); 

// ok I get we are getting the new velocity since v = a * t, obviously I   
// don't what acceleration() is returning though. 

Establecemos el cambio de salida derivada en la posición a la nueva velocidad de los estados? ¿Eh?

Por último, esta simulación de prueba se ejecuta haciendo esto:

var state:State = new State();
state.x = 100;
state.v = 0;

t = 0;
dt = 0.1;

while (Math.abs(state.x)>0.001 || Math.abs(state.v)>0.001)
{
    trace(state.x, state.v);
    integrate(state, t, dt);
    t += dt;
}

Entonces, ¿estamos estableciendo un nuevo estado con un valor posicional de 100 y una velocidad de 0? ¿Cuál es el punto de esta simulación si no tenemos velocidad ...

De todos modos, no hace falta decir que estoy bastante confundido y me he alejado del planeta Tierra. Esperando que alguien pueda aclarar esto para mí.

Bennett Yeates
fuente
Si lo que buscas es juegos, RK4 es una exageración y, debido a su relación costo / estabilidad, no es la mejor opción para esos cambios bruscos y bruscos en tu aceleración. Si está buscando una discusión sobre qué tipo de integradores vale la pena elegir, y cómo construir un simulador bastante simplista, puedo recomendar un informe técnico sobre exactamente estos problemas: arxiv.org/pdf/1311.5018v1.pdf
teodron
1
¡Interesante, tomaré un café y lo leeré! Personalmente, estoy interesado en comprender todo lo que pueda, desde la simulación básica hasta la avanzada. He hecho algunos muy básicos actualmente, pero esto es puramente una búsqueda de conocimiento para que pueda aumentar mi flexibilidad como desarrollador. Gracias por la referencia, lo aprecio mucho!
Bennett Yeates

Respuestas:

6

RK4 es un ejemplo de integrador numérico . La integración de Euler es un concepto similar, pero es mucho menos preciso. La integración numérica no es exacta, pero es mucho mejor para una computadora en una situación en tiempo real como un juego. La razón por la que usa RK4 en lugar de Euler es que RK4 tiene en cuenta la integración de la segunda y la tercera derivada (aceleración y tirón) y, por lo tanto, se adapta mucho mejor a la solución analítica.

RK4 es esencialmente una expansión de la serie Taylor de la ecuación diferencial que define la aceleración con respecto al desplazamiento y la velocidad. Esto le permite integrar fuerzas que dependen de estas cantidades, como restricciones e incluso gravitación universal. Las expansiones de la serie Taylor son útiles en la programación ya que las computadoras pueden evaluarlas de manera muy eficiente.

La accelerationfunción utilizada es un ejemplo es un sistema de resorte amortiguado simple, no gravitacional. kes la constante de resorte de Hooke y bse usa para humedecer el sistema (eliminar energía). Para casi todas las restricciones relacionadas con los resortes en su motor, querrá humedecerlas ya que los errores numéricos pueden causar una gran acumulación de energía, haciendo que la simulación explote. Si estuviera utilizando la integración de Euler, esto sería mucho peor.

Con respecto a acceleration(), un motor de física más completo calculará las aceleraciones lineales y angulares en función de las fuerzas (pares). Las fuerzas para sumar podrían incluir la gravedad (constante o basada en la Gravitación Universal), la flotabilidad y los resortes (la mayoría de las restricciones se pueden modelar usando resortes rígidos).

Su tercera pregunta es fácil de responder. En cinemática, hay tres cantidades básicas: desplazamiento (posición), velocidad y aceleración. La aceleración es la derivada de la velocidad, que es la derivada del desplazamiento (ambos con respecto al tiempo). Una derivada es solo la velocidad a la que algo cambia. Derivative.dxsignifica "la derivada de State.x".

Debido a que la simulación supone que el resorte está anclado en el origen y tiene una longitud de descanso de cero, un desplazamiento de 100 significa que la partícula comenzará a oscilar. La simulación de prueba finaliza cuando la partícula no se mueve y está cerca del origen.

jmegaffin
fuente
Otra descripción es que puedes pensar en RK4 como una expansión a medida de la ecuación diferencial.
RandyGaul
Esta es una gran respuesta y realmente expuso algunos agujeros en mi conocimiento de física. ¿Puede proporcionar algunas referencias a un buen punto de partida para comprender qué es un sistema de resorte amortiguado, pares, etc.? Creo que definitivamente me faltan estas mecánicas más avanzadas. Su respuesta realmente me aclara mucho, especialmente porque recientemente comencé a usar los polinomios de Taylor.
Bennett Yeates
Lo intentaría aquí: khanacademy.org/science/physics
jmegaffin
Perfecto, khanacademy era donde estaba pensando.
Bennett Yeates