Elegir una secuencia de animaciones para un NPC: ¿usar un árbol de comportamiento?

8

Estoy implementando un NPC para caminar por un espacio virtual, específicamente un gato. Tengo una serie de cortos clips de animación (3-5 segundos). Mi primer instinto fue elegir una animación aleatoria cuando terminó la última, pero me di cuenta de que no se vería realista, ya que cambiaría el comportamiento con demasiada frecuencia, incluso si la siguiente animación se limita a posibilidades físicamente contingentes.

Mi solución prevista es algo así como un árbol de comportamiento ( http://www.gamasutra.com/blogs/ChrisSimpson/20140717/221339/Behavior_trees_for_AI_How_they_work.php ), donde cada animación tiene una lista ponderada de las siguientes animaciones. Es decir, si el gato está caminando, tiene un 80% de posibilidades de seguir caminando, 20% de estar sentado, 0% de dormir. Básicamente, utilizando un modelo de Markov para obtener el siguiente paso apropiado.

Sin embargo, no tengo idea si esta es una buena solución, ni sé cómo voy a generar el mapeo de la animación actual a la próxima animación potencial + probabilidad. 30 animaciones * 30 animaciones siguientes = 900 ponderaciones. Eso es mucho para calcular manualmente.

El gato a veces reaccionará si golpea un obstáculo, pero la peor parte del problema es elegir una secuencia realista de animaciones sin elegirlas todas por adelantado. En el árbol también habría otras entradas, como proximidad a una persona, ubicación en la habitación, tiempo desde la última vez que comió, etc.

estrella de mar
fuente
2
Nunca he hecho este tipo de cosas, pero ¿sería suficiente un enfoque más simple? es decir, agrupe sus animaciones en "comportamientos" como: cazar, jugar, descansar, molestar a los humanos, etc. Entonces probablemente podría escapar sin ese modelo de Markov y solo tener problemas simples. dentro de grupos y problemas para cambiar de grupo en función del tiempo / eventos externos.
Mat

Respuestas:

3

En general, debe dividir la lógica de sus gatos de sus animaciones.

Ahora primero debes escribir la lógica de los gatos. Un buen enfoque que he encontrado es dividir la lógica en capas.

Necesidades

El gato puede tener algún estado con algunos motivos / necesidades (comer, dormir, etc.) que crecen lentamente con el tiempo y se reducen al hacerlo (piense en Sims). Puede elegir la tarea actual que satisfaga la mayor necesidad utilizando lógica difusa si lo desea.

Tareas

Ahora, en cada momento, el gato tiene una tarea (buscar comida, encontrar cama para dormir, espacio para correr, etc. Estar inactivo también es una tarea). Estas tareas le dicen al gato a dónde quiere ir y qué hacer.

Comportamiento

Ahora hay una tercera capa: acciones. Cada objetivo tiene una cola de acciones para hacer (ponerse de pie, caminar, agacharse, comer, etc.). Cada acción es responsable de su ejecución. Por ejemplo, la acción de caminar debe verificar si hay obstáculos y llevar al gato del punto A al punto B, posiblemente conteniendo y ejecutando sub-acciones (saltar sobre obstáculos, agacharse debajo de los muebles, etc.).

Animaciones

Ahora, cuando el gato tiene necesidades, una tarea y una acción, puedes elegir la animación adecuada para esa acción. Conociendo la animación actual y la próxima, debería poder pasar de una a otra. Por ejemplo, si la tarea dice que el gato debe acostarse después de caminar hacia su almohada, las animaciones se ponen en cola: caminar, parar, sentarse y acostarse.

La puesta en cola de las animaciones se puede hacer de manera efectiva si las mapea en un gráfico como nodos y conecta los nodos entre animaciones transicionales (por ejemplo, caminar para sentarse es posible, pero saltar para masticar, no). Luego, puede poner en cola las animaciones de cada una de ellas utilizando A * en este gráfico.

Ejemplo: el gato necesita descansar y comer. Deje que la tarea "Descanso" encuentre un lugar para descansar, pasee al gato allí, recuéstelo y descanse. Deje que la tarea "Descanso" verifique las condiciones de vez en cuando, si el entorno se vuelve incómodo, deje que la tarea finalice. Comprueba qué gato quiere más ahora, si todavía quiere descansar, repite la parte anterior. Cuando el gato esté descansado, elija una nueva tarea.

Kromster
fuente
2

Creo que lo que está buscando es la máquina de estados finitos o FSM. En resumen, es una forma de cambiar el comportamiento de los NPC: s de acuerdo con su estado actual.

EDITAR:

Es como un árbol de comportamiento pero condensado en algunos "estados" de grupos a los que regresa el NPC. Un árbol de comportamiento permite mucha más flexibilidad del comportamiento, pero también necesita más datos para ponderar las probabilidades (una forma inteligente de automatizarlo es con etiquetas, como sugiere scriptin en su respuesta). Cuando usa estados, decide un cierto conjunto de acciones y probabilidades para esas acciones en el estado. Para cambiar actalmente la acción actual se puede sesgar con quizás el 80% para mantener la misma acción, si la acción se debe cambiar, se utilizan las diferentes probabilidades para seleccionar la nueva acción.

En su caso, los estados podrían ser (un poco simplificados):

  • Sueño: dormir 80%, sentarse 15%, caminar 5%
  • Enojado: rugido (¿rugen los gatos?) 40%, silbido 40%, carrera 20%
  • Hambriento: come 40%, caza 40%, corre 10%
  • Playfull: juega 60%, corre 20%, salta 10%
  • Marcado: Ocultar 50%, Ejecutar 50%

Cada estado puede tener diferentes probabilidades de cambiar de estado, por ejemplo, el estado enojado o cicatrizado tal vez no dure mucho. Los diferentes estados también pueden tener reglas diferentes para lo que es legal (cambiar de "somnoliento" a "juguetón" puede ser ilegal, pero los gatos parecen no preocuparse por eso). Diferentes eventos pueden provocar que el estado cambie.

Eche un vistazo buscando en la web FSM e IA y podrá ver cómo funciona. Puede parecer complicado al explicarlo, pero es realmente simple.

Fredrik Lundvall
fuente
Acaba de describir una solución propuesta en la pregunta, con un nombre diferente.
scriptin
Los árboles de comportamiento son mucho más complejos que las máquinas de estado, la implementación y la necesidad de configurar el peso es mucho más fácil
Fredrik Lundvall
Entiendo que. Pero el algoritmo descrito en la pregunta es exactamente lo que has descrito. (Supongo que OP está describiendo un FSM en lugar de un árbol de comportamiento). Además, no está abordando el problema de demasiadas permutaciones de estados, lo que parece ser la principal preocupación de la pregunta.
scriptin
Tienes razón acerca de que mi respuesta no estaba realmente abordando el problema. Sin embargo, quería señalarlo en la dirección correcta. Debido a que las permutaciones no son realmente un problema con las máquinas de estado
Fredrik Lundvall
Esa información adicional podría ser muy útil. ¿Quizás podría editar su respuesta para elaborar estas diferencias b / w FSM y BT?
scriptin
1

Puedes usar el etiquetado:

  • Puede haber etiquetas de movimiento como "acostado", "sentado", "de pie", "caminando" y "corriendo". Luego, puede eliminar combinaciones poco realistas de etiquetas, por ejemplo, "colocación" -> "ejecución" (debe haber "de pie" en el medio).

  • Otras etiquetas pueden describir actividades: "dormir", "comer", "cazar", etc. Nuevamente, "dormir" -> "cazar" es imposible sin estados intermedios.

  • Dado que las animaciones como "de pie" son transitorias, puede ser una buena idea tener etiquetas separadas para el comienzo y el final de cada animación. Por ejemplo, "ponerse de pie" puede ser una transición de "sentarse" a "quedarse", etc.

Entonces, para cada animación podría tener algunas etiquetas:

  • Los que describen la posición / movimiento inicial y final
  • Al menos uno que describa una actividad. Además, dado que las actividades también tienen transiciones, también puede tener etiquetas iniciales y finales aquí

Con ellos, puede filtrar solo las combinaciones posibles estableciendo restricciones como " A->Bes posible solo si final_movement_tag(A) == initial_movement_tag(B)", lo que dará como resultado un número mucho menor. Con esas posibles combinaciones, podría hacer lo que ha descrito: agregar probabilidades. Agregar probabilidades puede basarse en etiquetas de actividad, ya que permanecer en una misma actividad es más probable que cambiar actividades.

Por lo tanto, con las etiquetas podría automatizar la creación de todas las transiciones en su árbol FSM / comportamiento, y ajustarlas más tarde si no está satisfecho con algunas combinaciones.

scriptin
fuente
1

Si desea mantener las ricas posibilidades de los árboles de comportamiento, puede agregar un nuevo tipo de nodo selector compuesto: el nodo selector Markov.

Tendría que implementar el nodo selector de Markov usted mismo. Seleccionará uno de sus nodos secundarios al azar, dependiendo del nodo (secundario) que tuvo éxito (o falló) anteriormente.

Kasper van den Berg
fuente