AI para mover naves espaciales con formas personalizadas (la forma afecta el comportamiento del movimiento)

15

Estoy diseñando un juego de estrategia de combate de flota espacial 3D-6DOF en red basado en turnos que se basa en gran medida en la personalización de la nave. Déjame explicarte un poco el juego, ya que necesitas saber un poco sobre él para hacer la pregunta.

Lo que busco es la capacidad de crear su propia flota de barcos con formas personalizadas y módulos adjuntos (hélices, vigas de tractor ...) que darían ventajas y desventajas a cada barco, por lo que tiene muchas distribuciones de flota diferentes. Por ejemplo, una nave larga con dos hélices a los lados permitiría que la nave gire fácilmente alrededor de ese avión, las naves más grandes se moverían lentamente a menos que coloque muchas hélices en la parte posterior (por lo tanto, gastará más puntos de "construcción" y energía al moverse, y lo hará). solo muévete rápido hacia esa dirección.) Planeo equilibrar todo el juego en torno a esta función.

El juego giraría en torno a dos fases: órdenes y fase de combate. Durante la fase de órdenes, comanda las diferentes naves. Cuando todos los jugadores finalizan la fase de orden, comienza la fase de combate y las órdenes del barco se resuelven en tiempo real durante un tiempo, luego la acción se detiene y hay una nueva fase de órdenes.

El problema viene cuando pienso en la entrada del jugador. Para mover un barco, debe encender o apagar diferentes hélices si desea dirigir, viajar hacia adelante, frenar, rotar en su lugar ... Estas hélices no tienen que funcionar con toda su potencia, por lo que puede lograr más movimiento combinaciones con menos hélices.

Creo que este enfoque es un poco aburrido. El jugador no quiere jugar con motores ni nada, solo quieres MOVER y MATAR. La forma en que pretendo que el jugador dé órdenes a estas naves es por un destino y una rotación , y luego la IA calcularía la potencia correcta de la hélice para lograr ese movimiento y rotación. La propulsión no tiene que ser la misma durante todo el cálculo del turno (después de que se hayan dado las órdenes), por lo que sería genial si las naves reaccionaran mientras se movían, ajustando el poder de las hélices para sus necesidades dinámicamente, pero puede ser demasiado difícil de implementar y no es realmente necesario para que el juego funcione.

En ambos casos, ¿cómo decidiría esa IA qué hélices activar para lograr la mejor (o al menos no la peor) trayectoria?

Pensé en algunos enfoques:

  • Aprendiendo IA: los tipos de barcos aprenderían sobre su movimiento por prueba y error, ajustando su comportamiento con más usos y finalmente se volverían "inteligentes". No quiero involucrarme TAN lejos en la codificación de IA, y creo que puede ser frustrante para el jugador (incluso si puedes dejar que aprenda sin jugar).
  • Movimiento de paso de tiempo precalculado: tras la creación de la nave, TODOS los movimientos posibles se calculan para cada configuración de hélice y potencia para un tiempo delta dado. Memoria intensiva, fea, mala.
  • Trayectorias precalculadas: lo mismo que el anterior pero no para cada tiempo delta sino para toda la trayectoria, que luego se ajustaría tanto como sea posible. Requiere una configuración de hélice fija para toda la fase de combate y sigue siendo intensiva en memoria, fea y mala.
  • Fuerza bruta continua: la IA comprueba continuamente TODAS las configuraciones posibles de hélice a lo largo de toda la fase de combate, calcula previamente algunos pasos de tiempo y decide cuál es la mejor en función de eso. Contras: lo que es bueno ahora puede que no sea tan bueno más tarde, y es demasiado intensivo en CPU, feo y malo también.
  • Fuerza bruta única: igual que la anterior, pero solo fuerza bruta al comienzo de la simulación, por lo que necesita una configuración constante de la hélice durante toda la fase de combate.
  • Comprobación de ángulo continuo: este no es un método de movimiento completo, sino una forma de descartar configuraciones de hélice "estúpidas". Dado el vector normal de la hélice actual y el final, puede aproximar la potencia necesaria para la hélice en función del ángulo. Debes hacer esto continuamente durante toda la fase de combate. Me di cuenta de esto recientemente, así que no pensé demasiado. A priori, también tiene el inconveniente de "lo que es bueno ahora podría no ser tan bueno más tarde", y no le importan las otras hélices que pueden actuar juntas para hacer una mejor configuración de propulsión.

Estoy realmente atrapado aquí. ¿Algunas ideas?

kaoD
fuente
¿Has estudiado los comportamientos de dirección?
Stonemetal
1
@stonemetal seguro. El problema aquí es que los comportamientos de dirección generalmente se modelan asumiendo un control total de la posición y la rotación del objeto y algunas restricciones (o al menos eso es lo que encontré en la web). La IA aquí no tiene control total sobre la entidad , pero solo sobre cosas (hélices) que hacen que la entidad se mueva. Tengo problemas para conectar estos comportamientos de dirección con la locomoción real de la nave espacial.
kaoD
Esa es la misma razón por la cual los comportamientos de dirección no funcionan demasiado bien en los autos de carrera. Los comportamientos de dirección son geniales, pero no son la solución universal para todo.
Tenpn
@haoD Estaba pensando en algo como lo que respondió ghostonline. Permítales construir lo que sea y luego traducirlo a restricciones para un comportamiento de dirección. Aunque por su respuesta parece que los comportamientos de dirección probablemente no sean lo suficientemente flexibles como son.
stonemetal
1
Sé que esto es muy antiguo, pero lo que estás buscando se llama planificación de movimiento
kinodinámico

Respuestas:

4

Lo sentimos, no tengo una solución probada, pero ¿no se puede resolver matemáticamente?

Dada cualquier hélice y su desplazamiento desde el centro de masa, puede calcular en qué plano puede rotar.

Para cualquier movimiento, puede usar 1 o más hélices. Se puede consultar cada hélice para ver si su plano puede contribuir a la orientación del objetivo, cuánto esfuerzo le tomaría a la hélice contribuir (las hélices lejos del CoM pueden usar menos energía para generar más giro), y qué tan cerca se conseguiría usted a la orientación del objetivo. Luego, A * atraviesa ese espacio de búsqueda hasta encontrar una solución de bajo costo, que podría ser la energía total menos utilizada o el movimiento más rápido.

Siga reevaluando eso a medida que completa el giro y potencia moderada a medida que se acerca al objetivo, tal vez con un controlador PID.

Para avanzar, una solución simple lo llevaría siempre hacia adelante, reduciendo su velocidad objetivo a medida que se acerca al objetivo. Como tienes espacio 3D para jugar, puedes evitar complicadas rutinas de giro de 3 puntos. Debería tener en cuenta la salida de las hélices elegidas para la velocidad en línea recta en sus cálculos de giro, como una especie de estado inicial.

Esto es muy complicado pero no veo fallas importantes. Solo mucho trabajo duro y ajustes de números. :)

tenpn
fuente
Esto es lo que estaba buscando, una solución matemática ... ¡gracias! Espero que sea tan fácil como parece.
kaoD
7

Dado que desea ceder un poco de control del jugador para la jugabilidad usando una IA, es posible que también desee considerar simplificar el efecto de virar sobre las hélices y alterar las dimensiones del barco en parámetros menos manejables para un algoritmo informático. El jugador aún puede agregar hélices en cualquier parte del barco, pero una vez completado, esto se 'comprime' en parámetros.

Cada hélice afecta la velocidad de giro de la nave o, combinada con una hélice colocada en paralelo, afecta la velocidad de desplazamiento en una dimensión específica. Combina estos parámetros para cada hélice y obtendrás la velocidad y velocidad de giro máximas para un barco. Combina estos dos parámetros para cada hélice y conjunto de hélice en la velocidad máxima de giro y velocidad para el barco en su conjunto, para todas las dimensiones disponibles (arriba, abajo, izquierda, derecha, adelante, atrás).

Usando la velocidad de giro y la velocidad para cada dimensión, tiene suficiente información para permitir que la nave se mueva a un destino. El jugador verá el efecto de su configuración de hélice, pero debajo del capó su entrada se simplifica enormemente. Podrías idear más de una estrategia de vuelo en función de la distancia que tiene que recorrer el barco, para hacer que el vuelo se vea más natural y aumentar la sensación del jugador de que él o ella ha ejercido el control sobre el movimiento del barco. Pero al final, como dijiste, no importará cómo llega el barco al destino y si su ruta es óptima, solo necesita estar allí y su hora de llegada está influenciada por la configuración de la hélice.

Para las dimensiones de la nave, puede factorizarlas una vez que tenga los valores de velocidad comprimidos para un efecto aproximado, o usarlos mientras calcula para un efecto más preciso. Probablemente quieras probar si el método preciso vale la pena, porque la diferencia podría no afectar el sentido de control del jugador.

fantasma
fuente
No es exactamente lo que estaba buscando, pero podría hacer el truco si realmente lo necesito. Votación a favor de la idea :)
kaoD
0

En el espacio, la forma no afecta el movimiento. No hay aire para arrastrar.

Lo que importa es el barco más la masa total de complementos. Es un problema de gravedad de empuje de masa más simple. Así que puedes hacer estos cálculos o, dado que es un juego base por turnos, desarrolla un sistema de movimiento como los juegos de rol como Traveler.

gnoll110
fuente
¡Bienvenido a GD.SE! Esta pregunta ya tiene una respuesta aceptada y se le hizo hace 2 años, tal vez podría responder algunas de las preguntas más recientes en el sitio.
Polar
Sí, todo es cierto, pero siempre asumo que otros lo encontrarán más tarde (como lo hice) y lo encontraré útil. jeje, no vine aquí para responder preguntas ... como la mayoría, buscando soluciones para mis propios problemas.
gnoll110
@ Cartel de preguntas polares aquí. ¡Su respuesta me pareció muy interesante! Me alegra que haya regresado para responder, y creo que agregar valor años más tarde es una de las partes más valiosas de SO.
kaoD
@ gnoll110 Podría estar equivocado aquí. No hay arrastre, está bien, pero el ángulo que forma el vector de empuje con el centro de masa afecta la forma en que el barco se traduce o gira ... ¿verdad? Por ejemplo: un motor en línea con el centro de masa se traduce, al moverlo fuera del centro de masa agregará un componente giratorio a la nave.
kaoD
@kaoD Lo siento si parecía un poco duro, obviamente mucho SO está agregando valor más tarde. Solo estaba sugiriendo que él también podría responder nuevas preguntas: ¡cuantas más preguntas se respondan, mejor!
Polar