¿Simulación de la gravedad en un juego 3D?

Muy bien, estoy escribiendo un simulador espacial para un juego en 3D y me gustaría implementar la gravedad de los objetos en él.

¿Hay una buena manera de encontrar un vector de velocidad que se pueda agregar a mi vector de salida del motor para crear el efecto de la gravedad?

Además, ¿cómo podría encontrar las velocidades requeridas para poner el objeto A en órbita alrededor del objeto B a cierta distancia?

¿Son los objetos del mismo tamaño que su nave espacial, o su nave espacial es significativamente más pequeña? En el segundo caso, puedes simplificar mucho.
O quieres física real, en cuyo caso creo que tus preguntas ya han sido respondidas en el sitio, o quieres algún tipo de física de juego , en cuyo caso podrías estar mejor en GameDev.SE .
¿No puedes usar Physics Engines listos para usar?

Respuestas (1)

Bueno, necesitas resolver ecuaciones diferenciales (probablemente no sea la mejor manera aquí) o simular numéricamente.

No hay forma de dar la velocidad de una constelación arbitraria sin conocer su pasado. Por lo tanto, también debe realizar un seguimiento de la velocidad de todo.

Básicamente, necesitas estas ecuaciones/tareas:

Suma todas las fuerzas gravitatorias de todas las demás masas de tu mundo.

a i es la aceleración de la masa en cuestión hacia el i -ésima masa. GRAMO es la constante gravitacional de Newton, 6.67 10 11 .

a i = GRAMO METRO i r i 2 r ^ i = GRAMO METRO i r i 3 r i

La aceleración total sobre el objeto se suma a la aceleración sobre el objeto. Tienes que sumar vectorialmente aquí. Si, por ejemplo, tienes dos fuerzas opuestas, la masa no se aceleraría en absoluto.

a = i a i

Esta es la aceleración sobre la masa. metro cuando es atraído por otra masa METRO . Tienes que multiplicarlo con un elegido Δ t para obtener el cambio de velocidad. Cuanto más pequeño lo elija, más precisa será su simulación, pero llevará más tiempo. Tienes que probar diferentes valores para ello.

Δ v = a Δ t
v := v + Δ v

Y usa esa velocidad actualizada para calcular el cambio de posición.

Δ X = v Δ t
X := X + Δ v

a , v y X son vectores en el espacio 3D.

La idea básica es a d t = v + v 0 , v d t = d + d 0 , dónde v 0 y d 0 son los + C constantes de integración. En este contexto, son la velocidad y la distancia que ya tiene o ha recorrido el objeto, respectivamente.

órbita estacionaria

Para obtener tal órbita, debe igualar la fuerza centrípeta a la fuerza gravitatoria. O dices que la fuerza centrífuga y la gravedad se anulan entre sí.

Así que empieza con

metro v 2 r = GRAMO metro METRO r 2

o

metro v 2 r + GRAMO metro METRO r 2 = 0

metro es la masa del satélite, METRO la masa del objeto grande, es decir, el planeta. GRAMO es la constante gravitatoria y r es la distancia entre los dos objetos.

De cualquier manera, terminarás con

v = GRAMO METRO r

Como la velocidad tangencial para una órbita con radio r alrededor de un objeto con masa METRO . Esto supone que el otro objeto es mucho más pesado que el satélite.

Mi cerebro podría haber explotado, pero eso tiene sentido. Uf, soy matemático, no físico.
Básicamente, ai es la aceleración hacia i, ¿a es la aceleración hacia todo? G es la fuerza del campo gravitacional?
Los comentarios de varias líneas realmente ayudarían en este momento ... En su ejemplo de órbita, supongo que v es la velocidad requerida para contrarrestar la aceleración de la gravedad y, por lo tanto, permanecer en una órbita algo estable.
Como nota divertida, delta t es de 3 segundos. Mi motor realmente no está diseñado para la simulación espacial.
Tus suposiciones son correctas. La velocidad v es el que necesitas para caer alrededor del planeta, en lugar de sobre el planeta. Caes sobre el planeta, pero eres tan rápido que te moviste alrededor del planeta, por lo tanto, no lo golpeaste.
@queueoverflow Entonces, ¿uno tiene que decidir si todo el sistema debe estar estacionario (alrededor de un centro pesado para todos los planetas), o suelto, de modo que cada "Planeta" se atraiga entre sí?
@philipp Si sus planetas son lo suficientemente livianos y están lo suficientemente separados, uno puede ignorar esta atracción entre planetas. Esos efectos causan efectos de marea y, de hecho, Júpiter y Saturno causaron esos efectos de marea en Urano y Neptuno. Están tan lejos gracias a ellos, pero la escala de tiempo es realmente grande para esos efectos.