¿Cómo puedo factorizar el impulso en mi simulador espacial?

8

Estoy intentando crear un motor de física 2D simple en este momento, y me encuentro con algunos problemas para descubrir cómo incorporar el impulso en el movimiento de una nave espacial.

Si me estoy moviendo en una dirección determinada a una velocidad determinada, actualmente puedo actualizar fácilmente la posición de mi nave (Posición + = Dirección * Velocidad). Sin embargo, si el barco gira en absoluto, y recalculo la dirección (en función del nuevo ángulo que enfrenta el barco) y acelero en esa dirección, ¿cómo puedo tener en cuenta el impulso para alterar la "línea" que viaja el barco? Actualmente, la nave cambia de dirección instantáneamente y continúa a su velocidad actual en esa nueva dirección cuando presiono el botón de empuje. Quiero que sea un movimiento de giro más gradual para dar la impresión de que el barco en sí tiene algo de masa.

Si ya hay una buena publicación sobre este tema, me disculpo, pero no apareció nada en mis búsquedas. Avíseme si necesita más información, pero espero que alguien pueda decirme fácilmente cómo puedo agregar velocidad en masa * a la actualización de mi ciclo de juego.

Josh Petite
fuente
Si está buscando más información sobre cómo programar el movimiento, es posible que desee ver el juego gratuito Transcendence, otro shooter espacial en 2D que lo utiliza. Tal vez se puede ver en sus guiones o pedir a los desarrolladores cómo lo hicieron
Mastersteviekun

Respuestas:

7

¿Parece que tienes Posición y Dirección como vectores y Velocidad como escalar?

Si es así, simplemente cambie la Velocidad en un vector también y luego haga algo como esto:

Force = Direction * Power
Acceleration = Force / Mass
Velocity += Acceleration * ElapsedTime
Position += Velocity * ElapsedTime

La dirección es un vector de longitud unitaria que da el rumbo de su nave. Poder es la cantidad de empuje que desea agregar (Cero cuando no se necesita aceleración) ElapsedTime es el tiempo entre las llamadas de actualización de su juego para mantener el movimiento suave incluso cuando su velocidad de cuadros está cambiando

Si desea saber más al respecto, puede buscar la integración de Euler

Señor campana
fuente
1
Sí, y el siguiente paso es modelar la Ley de Newton F = m * a. Entonces, en lugar de usar una constante de "Potencia" para obtener la aceleración, usas Aceleración = Fuerza / masa. Entonces, cuando aplicas empuje, lo aplicas como un vector de fuerza. Hacer esto te permitirá aplicar otras fuerzas a tu nave espacial fácilmente agregando todos los vectores de fuerza y ​​calculando la aceleración correspondiente. También significa que puedes jugar con Mass como una variable separada.
TerryB
Terry tiene razón, olvidé incorporar eso en mi publicación original.
Sr. Bell
Gracias Sr. Bell / Terry. Ambas ecuaciones enumeradas anteriormente me ayudaron programáticamente a hacer esto. Estaba teniendo muchos problemas para entender cómo funcionaría esto tratando de usar flotadores en todo el lugar. Después de cambiar todo menos la masa a vectores (gracias a leftium arriba), finalmente pude hacer que las cosas funcionen.
Josh Petite
8

En lugar de manipular la velocidad directamente, agregue otra variable: aceleración , que gradualmente altera la velocidad suavemente :

De la física clásica ( leyes del movimiento de Newton ):

a =  F/m  // a Force will result in a smaller acceleration on objects with more mass
v += a    // acceleration is the rate of change in velocity
p += v    // velocity is the rate of change in position    

dónde:

a = acceleration, v = velocity, p = position
F = force, m = mass

(Tenga en cuenta que m es el único valor escalar; F, a, v y p son todos vectores 2D o 3D)

Además, en realidad hay dos direcciones:

  1. La dirección que enfrenta el barco. La fuerza de los motores se aplica a lo largo de este vector.
  2. La dirección en la que se mueve la nave (debido al impulso). Este es el vector de velocidad v.

Respondí una pregunta relacionada sobre StackOverflow: matemática del movimiento de nave espacial 2D . Hay algún código de muestra en esa respuesta.

Leftium
fuente
Tenga en cuenta que en una simulación basada en ticks, usar ese método le dará resultados incorrectos. Las fórmulas base son correctas en el mundo continuo de la física, pero deberá realizar una integración numérica para obtener resultados precisos. Más detalles aquí: gafferongames.com/game-physics/integration-basics
Tetrad
Finalmente conseguí que esto funcionara. Muchas gracias a todos. Me llevó un tiempo descubrir cómo analizar este evento de entrada inteligente junto con mi actualización (así como incorporar el uso del tiempo).
Josh Petite