Si bien la mecánica orbital no es lo mío, lo haría de esta manera:
Para fines prácticos, el movimiento físico se rige por las leyes de newton:
[matemáticas] F = m * a [/ matemáticas]
- ¿Podemos vivir sin la luna?
- ¿Tendríamos alguna vez suficiente tecnología para viajar entre estrellas o planetas?
- ¿Se podría completar Apollo sin el uso de Saturno V, utilizando múltiples de los cohetes Saturno más pequeños?
- ¿Qué pasaría si una capa de 50 centímetros de agua cayera sobre la superficie de la tierra al mismo tiempo?
- ¿Es posible aterrizar en un planeta gaseoso como Júpiter?
[matemáticas] S = v * t + a * t * t / 2 [/ matemáticas]
[matemáticas] v = v0 + a * t [/ matemáticas]
F – fuerza aplicada al cuerpo.
M – masa.
a – aceleración.
S – distancia recorrida.
v – velocidad (v0 velocidad anterior)
t – tiempo.
Además de eso, hay una fórmula para la fórmula gravitacional entre dos cuerpos (ver: Ley de Newton de la gravitación universal – Wikipedia):
[matemáticas] F = G * m1 * m2 / (r ^ 2) [/ matemáticas]
La fuerza de gravedad entre cuerpos equivale a la masa del primer cuerpo multiplicada por la masa del segundo cuerpo, multiplicada por la constante gravitacional ((6.674 × 10−11 N · (m / kg) 2), dividida por la distancia al cuadrado.
Entonces, ¿por qué estoy explicando la física?
Para calcular la siguiente posición de un cuerpo, necesita saber, la posición actual del cuerpo, la velocidad, las fuerzas aplicadas a él. Usando los que calculas la aceleración corporal para el cuadro actual, y usando esa aceleración, calculas el cambio de velocidad y posición. Básicamente, cada cuadro que haces:
force = collectForces ()
currentAcceleration = force / object.mass
nextPostiion = currentPostiion + currentVelocity * deltaTime + currentAcceleration * deltaTime * deltaTime / 2
nextVelocity = currentVelocity + currentAcceleration * t
Y puede simular físicamente el movimiento correcto (bueno, más o menos correcto, habrá pequeños errores numéricos que se acumularán con el tiempo).
En este método, la gravedad entra en juego en la fase de “reunir fuerzas”, donde se incluye en el vecotor de fuerza de resumen.
Ahora … trayectoria.
Hay fórmulas para la mecánica orbital, la cuestión es que no estoy familiarizado con ninguna de ellas.
Sin embargo, lo que puede hacer es aplicar un método simple: tome los parámetros iniciales y luego, en un bucle, calcule las posiciones usando pequeños pasos de tiempo fijos.
básicamente:
fixedTimeStep = 1.0f // 1 segundo
resultTrajectory = nueva Lista ()
startPosition = …
startVelocity = …
objectMass = …
currentPos = startingPosition
currentVel = startingVelcoity
resultTrajectory.append (currentPos)
por N veces {
currentForce = collectForces ()
currentAccel = currentForce / mass
deltaT = fixedTimeStep
nextPos = currentPos + currentVel * deltaT + currentAccel * deltaT * deltaT * 0.5
nextVel = currentVel + currentAccel * deltaT
resultTrajectory.append (nextPos)
currentPos = nextPos
currentVel = nextVel
}
Y esto le dará una trayectoria de objeto para la duración específica.
Debido a que esta fórmula básica es muy simple, es muy rápida, por lo que no tendrá problemas para calcular algunos miles de puntos de trayectoria por cuadro.
Para obtener información adicional, puede consultar los documentos de Chris Hecker sobre la dinámica del cuerpo rígido
Dinámica del cuerpo rígido