Estoy creando un juego espacial en 2D y necesito hacer que la nave espacial intercepte un planeta. Tengo un código de trabajo para las intersecciones en línea recta, pero no puedo entender cómo calcular la ubicación de los planetas en una órbita circular.
El juego no es científicamente preciso, así que no me preocupa la inercia, la gravedad, las órbitas elípticas, etc.
Conozco la ubicación y la velocidad de las naves espaciales y también la órbita (radio) y la velocidad de los planetas.
2d
mathematics
physics
Ausa
fuente
fuente
Respuestas:
Una solución analítica para esto es difícil, pero podemos usar la búsqueda binaria para encontrar una solución dentro de la precisión requerida.
El barco puede alcanzar el punto más cercano en la órbita en el tiempo t_min :
La nave puede alcanzar CUALQUIER punto de la órbita en un tiempo menor o igual que t_max :
(Aquí, por simplicidad, supongo que el barco puede conducir a través del sol. Si desea evitar esto, entonces deberá cambiar a caminos que no sean de línea recta por al menos algunos casos. "Los círculos de besos" pueden verse bien y orbitales) mecánica-y, sin cambiar el algoritmo en más de un factor constante)
Si nuestro período orbital es corto, podríamos mejorar en este límite superior eligiendo
t_max
ser la primera vez después det_min
que el planeta se acerque más a la posición de inicio de la nave. Tome cualquiera de estos dos valores det_max
es menor. Vea esta respuesta posterior para obtener una derivación de por qué esto funciona.Ahora podemos usar la búsqueda binaria entre estos extremos, t_min y t_max . Buscaremos un valor t que obtenga el error cercano a cero:
(Con esta construcción, error @ t_min> = 0 y error @ t_max <= 0, por lo que debe haber al menos una intersección con error = 0 para un valor t intermedio)
donde, para completar, la función de posición es algo así como ...
Tenga en cuenta que si el período orbital del planeta es muy corto en comparación con la velocidad de la nave, esta función de error puede cambiar los signos varias veces durante t_min a t_max. Simplemente haga un seguimiento del primer par + ve & -ve que encuentre y continúe buscando entre ellos hasta que el error esté lo suficientemente cerca de cero ("lo suficientemente cerca" es sensible a sus unidades y contexto de juego. El cuadrado de la mitad de la duración del cuadro puede funciona bien, eso asegura que la intercepción sea precisa dentro de un marco)
Una vez que tengas un buen t para minimizar errores, puedes apuntar la nave hacia planet.positionAtTime (t) y acelerar a fondo, seguro de que el planeta llegará a ese punto al mismo tiempo que tú.
Siempre puede encontrar una solución dentro de las iteraciones Log_2 ((2 * orbitRadius / ship.maxSpeed) / errorThreshold). Entonces, por ejemplo, si mi nave puede atravesar la órbita en 60 cuadros, y quiero una intersección precisa dentro de un cuadro, necesitaré alrededor de 6 iteraciones.
fuente
No complicamos demasiado esto. Esta no es una solución "perfecta", pero debería funcionar para la mayoría de los juegos y cualquier imperfección debería ser invisible para el jugador.
Esto funciona porque cuanto más se acerca la nave espacial, más bajo se vuelve el error. Entonces el cálculo se vuelve más estable con el tiempo.
El error es la diferencia entre el tiempo necesario calculado para llegar al planeta (TimeNeeded) y el tiempo real necesario para llegar al planeta (después de tener en cuenta el nuevo TargetPoint).
fuente
Comencemos por echar un vistazo a las matemáticas detrás del problema.
Paso 1:
Encontrar la intersección entre una línea y una forma es solo una cuestión de insertar la ecuación de la línea en la ecuación de la forma, que en este caso es un círculo.
Toma un círculo con centro c y el radio r . Un punto p está en el círculo si
La distancia al cuadrado se puede reescribir como un producto de punto ( http://en.wikipedia.org/wiki/Dot_product ).
que es una ecuación cuadrática simple, y llegamos a la solución
Paso 2:
Entonces podemos definir una línea para el barco, y de eso obtenemos 0, 1 o 2μ valores . Si obtenemos 1 valor, use ese. Si obtenemos 2, simplemente elija uno de ellos.
¿Qué podemos hacer con esto? Bueno, ahora sabemos la distancia que debe recorrer el barco y en qué punto terminará.
Ahora, todo lo que queda por hacer es calcular dónde debería estar el planeta cuando la nave comience a acercarse a su órbita. Esto se calcula fácilmente con los denominados coodinatos polares ( http://mathworld.wolfram.com/PolarCoordinates.html )
Resumen
Elige una línea para tu nave y ejecuta los cálculos para ver si choca con la órbita del planeta. Si lo hace, calcule el tiempo que llevará llegar a ese punto. Use este tiempo para regresar a la órbita desde este punto con el planeta para calcular dónde debería estar el planeta cuando la nave comience a moverse.
fuente
Aquí hay dos soluciones ligeramente "listas para usar".
La pregunta es: dado que la nave se mueve en línea recta a una velocidad dada, y el planeta se mueve en un círculo de radio dado a una velocidad angular dada, y las posiciones iniciales del planeta y la nave, determinan qué vector de dirección de la nave debe haber una línea recta para trazar un curso de intercepción
Solución uno: negar la premisa de la pregunta. La cantidad que es "deslizable" en la pregunta es el ángulo. En cambio, arregla eso. Apunte la nave directamente al centro de la órbita.
Solución dos: no lo hagas en piloto automático en absoluto. Haz un mini-juego en el que el jugador tenga que usar propulsores para acercarse al planeta, y si lo golpean a una velocidad relativa demasiado alta, explotan, pero también tienen combustible limitado. ¡Haz que el jugador aprenda a resolver el problema de intercepción!
fuente
La posición del planeta en el espacio y el tiempo se puede parametrizar, p. Ej.
Esta ecuación necesita ser resuelta numéricamente. Puede tener muchas soluciones. Al mirarlo, parece que siempre tiene una solución
fuente
Aquí hay parte de una solución. No pude terminarlo a tiempo. Lo intentaré más tarde.
Si entiendo correctamente, tienes la posición y velocidad de un planeta, así como la posición y velocidad de una nave. Desea obtener la dirección de movimiento del barco. Supongo que las velocidades de la nave y del planeta son constantes. También supongo, sin pérdida de generalidad, que el barco está en (0,0); para hacer esto, reste la posición de la nave de la del planeta y agregue la posición de la nave nuevamente al resultado de la operación que se describe a continuación.
Desafortunadamente, sin látex , no puedo formatear esta respuesta muy bien, pero intentaremos hacerlo. Dejar:
s_s
= la velocidad del barco (s_s.x, s_s.y, igualmente)s_a
= el rumbo del barco (ángulo de movimiento, lo que queremos calcular )p_p
= posición inicial del planeta, coordenadas globalesp_r
= la distancia del planeta (radio) desde el centro de la órbita, derivable dep_p
p_a
= el ángulo inicial del planeta en radianes, en relación con el centro de la órbitap_s
= la velocidad angular del planeta (rad / seg)t
= el tiempo de colisión (esto resulta ser algo que también debemos calcular)Aquí están las ecuaciones para la posición de los dos cuerpos, desglosadas en componentes:
Como queremos
ship.x = planet.x
yship.y = planet.y
en algún momentot
, obtenemos esta ecuación (ely
caso es casi simétrico):Resolviendo la ecuación superior para s_a:
Sustituir esto en la segunda ecuación da como resultado una ecuación bastante aterradora que Wolfram alpha no resolverá por mí . Puede haber una mejor manera de hacer esto sin involucrar coordenadas polares. Si alguien quiere probar este método, puede hacerlo; He hecho esto un wiki. De lo contrario, puede llevar esto a Math StackExchange .
fuente
Arreglaría la ubicación en la que interceptar (pastar el círculo, en el lado "saliente" de la órbita).
Ahora solo tienes que ajustar la velocidad de la nave espacial para que el planeta y la nave lleguen a ese punto al mismo tiempo.
Tenga en cuenta que la cita podría ser después de N órbitas más, dependiendo de qué tan lejos esté la nave y qué tan rápido el planeta orbita la estrella.
Elija la N que con el tiempo se acerca más a la duración del viaje del barco a la velocidad actual.
Luego, acelere o reduzca la velocidad de la nave para que coincida exactamente con la marca de tiempo de esas N órbitas.
¡En todo esto, el curso real ya se conoce! Simplemente no la velocidad.
fuente