Eine Sequenz von Animationen für einen NPC auswählen - einen Verhaltensbaum verwenden?

8

Ich implementiere einen NPC, um in einem virtuellen Raum herumzulaufen, insbesondere in einer Katze. Ich habe eine Reihe von kurzen Animationsclips (3-5 Sekunden). Mein erster Instinkt war nur, eine zufällige Animation auszuwählen, als die letzte endete, aber ich erkannte, dass sie nicht realistisch aussehen würde, da sie das Verhalten zu oft ändern würde, selbst wenn die nächste Animation auf physisch bedingte Möglichkeiten beschränkt ist.

Meine beabsichtigte Lösung ist so etwas wie ein Verhaltensbaum ( http://www.gamasutra.com/blogs/ChrisSimpson/20140717/221339/Behavior_trees_for_AI_How_they_work.php ), in dem jede Animation eine gewichtete Liste der nächsten Animationen enthält. Das heißt, wenn die Katze läuft, hat sie eine 80% ige Chance, weiterzulaufen, 20% im Sitzen, 0% im Schlaf. Grundsätzlich wird ein Markov-Modell verwendet, um den entsprechenden nächsten Schritt zu erhalten.

Ich habe jedoch keine Ahnung, ob dies eine gute Lösung ist, und ich weiß auch nicht, wie ich das Mapping von der aktuellen Animation zur potenziellen nächsten Animation + Wahrscheinlichkeit generieren werde. 30 Animationen * 30 nächste Animationen = 900 Gewichtungen. Das ist viel manuell zu berechnen.

Die Katze reagiert manchmal, wenn sie auf ein Hindernis stößt, aber die Hauptlast des Problems besteht darin, eine realistische Folge von Animationen auszuwählen, ohne sie alle im Voraus auszuwählen. Im Baum gibt es auch einige andere Eingaben, wie die Nähe zu einer Person, den Ort im Raum, die Zeit seit dem letzten Essen usw.

Seestern
quelle
2
Ich habe so etwas noch nie gemacht, aber würde ein einfacherer Ansatz ausreichen? dh gruppieren Sie Ihre Animationen in "Verhaltensweisen" wie: Jagen, Spielen, Ausruhen, nervige Menschen usw. Dann könnten Sie wahrscheinlich ohne dieses Markov-Modell davonkommen und nur einfache Probs haben. innerhalb von Gruppen und Probs zum Wechseln von Gruppen basierend auf Zeit / externen Ereignissen.
Mat

Antworten:

3

Im Allgemeinen müssen Sie die Logik Ihrer Katze von den Animationen trennen.

Jetzt müssen Sie zuerst die Katzenlogik schreiben. Ein guter Ansatz, den ich gefunden habe, besteht darin, die Logik in Ebenen aufzuteilen.

Bedürfnisse

Katze kann einen Zustand mit einigen Motiven / Bedürfnissen (Essen, Schlafen usw.) haben, die im Laufe der Zeit langsam wachsen und sich dabei verringern (denken Sie an Sims). Wenn Sie möchten, können Sie mithilfe der Fuzzy-Logik die aktuelle Aufgabe auswählen, die den größten Bedarf erfüllt.

Aufgaben

Jetzt hat die Katze zu jedem Zeitpunkt eine Aufgabe (Futter finden, Bett zum Schlafen finden, Platz zum Herumlaufen usw. Es ist auch eine Aufgabe, untätig zu sein). Diese Aufgaben sagen der Katze, wohin sie gehen möchte und was sie tun möchte.

Aktionen

Jetzt gibt es die 3. Ebene - Aktionen. Jedes Ziel hat eine Reihe von Aktionen zu erledigen (aufstehen, gehen, sich ducken, essen usw.). Jede Aktion ist für ihre Ausführung verantwortlich. Zum Beispiel sollte die Gehaktion nach Hindernissen suchen und die Katze von Punkt A nach Punkt B bringen, möglicherweise Unteraktionen enthalten und ausführen (über Hindernisse springen, unter Möbeln hocken usw.).

Animationen

Wenn die Katze nun Bedürfnisse, eine Aufgabe und eine Aktion hat, können Sie die richtige Animation für diese Aktion auswählen. Wenn Sie die aktuelle und nächste Animation kennen, sollten Sie in der Lage sein, von einer zur anderen zu wechseln. Wenn die Aufgabe beispielsweise besagt, dass die Katze nach dem Gehen zu ihrem Kissen liegen soll, werden die Animationen in die Warteschlange gestellt - Walk-Stop-Sit-Lay.

Das Einreihen von Animationen kann effektiv erfolgen, wenn Sie sie als Knoten in ein Diagramm abbilden und die Knoten zwischen übertragbaren Animationen verbinden (z. B. ist Gehen zum Sitzen möglich, aber Springen zum Kauen - nicht). Anschließend können Sie mithilfe von A * in diesem Diagramm Animationen von einer zur anderen in die Warteschlange stellen.

Beispiel: Katze muss sich ausruhen und fressen. Lassen Sie die Aufgabe "Ausruhen" einen Platz zum Ausruhen finden, gehen Sie mit der Katze dorthin, legen Sie sie hin und ruhen Sie sich aus. Lassen Sie die Aufgabe "Ruhe" ab und zu auf Bedingungen prüfen, wenn die Umgebung unangenehm wird. Lassen Sie die Aufgabe enden. Überprüfen Sie, was die Katze jetzt mehr will, wenn sie sich noch ausruhen will - wiederholen Sie den vorherigen Teil. Wenn die Katze ausgeruht ist - wählen Sie eine neue Aufgabe.

Kromster
quelle
2

Ich denke, was Sie suchen, ist die Finite-State-Maschine oder FSM. Kurz gesagt, es ist eine Möglichkeit, das Verhalten von NPCs entsprechend ihrem aktuellen Status zu ändern.

BEARBEITEN:

Es ist wie ein Verhaltensbaum, aber auf einige Gruppen "Zustände" reduziert, zu denen der NPC zurückkehrt. Ein Verhaltensbaum ermöglicht eine viel größere Flexibilität des Verhaltens, benötigt jedoch auch mehr Daten für die Gewichtung von Wahrscheinlichkeiten (eine clevere Möglichkeit, dies zu automatisieren, sind Tags, wie Scriptin in seiner Antwort vorschlägt). Wenn Sie Zustände verwenden, legen Sie eine Reihe von Aktionen und Wahrscheinlichkeiten für diese Aktionen im Zustand fest. Um die aktuelle Aktion tatsächlich zu ändern, kann sie mit möglicherweise 80% verzerrt werden, um dieselbe Aktion beizubehalten. Wenn die Aktion geändert werden sollte, werden die verschiedenen Wahrscheinlichkeiten verwendet, um die neue Aktion auszuwählen.

In Ihrem Fall könnten die Zustände sein (etwas vereinfacht):

  • Schläfrig: 80% schlafen, 15% sitzen, 5% laufen
  • Wütend: Brüllen (brüllen Katzen?) 40%, Zischen 40%, Laufen 20%
  • Hungrig: 40% essen, 40% jagen, 10% laufen
  • Spielerisch: 60% spielen, 20% laufen, 10% springen
  • Narben: 50% verstecken, 50% laufen lassen

Jeder Zustand kann unterschiedliche Wahrscheinlichkeiten haben, um den Zustand zu ändern, zum Beispiel hält der verärgerte oder vernarbte Zustand möglicherweise nicht lange an. Die verschiedenen Staaten können auch unterschiedliche Regeln für das haben, was legal ist (der Wechsel von "schläfrig" zu "verspielt" kann illegal sein, aber Katzen scheinen sich nicht darum zu kümmern). Verschiedene Ereignisse können dazu führen, dass sich der Status ändert.

Werfen Sie einen Blick um , indem die Bahn für FSM und AI suchen und Sie können sehen , wie es funktioniert. Es mag kompliziert erscheinen, wenn man es erklärt, aber es ist wirklich einfach.

Fredrik Lundvall
quelle
Sie haben gerade eine in der Frage vorgeschlagene Lösung mit einem anderen Namen beschrieben.
Scriptin
Verhaltensbäume sind viel komplexer als Zustandsmaschinen, die Implementierung und Notwendigkeit der Gewichtseinstellung ist viel einfacher
Fredrik Lundvall
Ich verstehe das. Der in der Frage beschriebene Algorithmus entspricht jedoch genau dem, was Sie beschrieben haben. (Ich denke, dass OP einen FSM anstelle eines Verhaltensbaums beschreibt.) Außerdem sprechen Sie nicht das Problem zu vieler Permutationen von Zuständen an, was das Hauptanliegen der Frage zu sein scheint.
Scriptin
Sie haben Recht damit, dass meine Antwort das Problem nicht wirklich angesprochen hat. Ich wollte ihn jedoch in die richtige Richtung weisen. Wegen der Permutationen, die nicht wirklich ein Problem mit Zustandsautomaten sind
Fredrik Lundvall
Diese zusätzlichen Informationen könnten sehr nützlich sein. Vielleicht könnten Sie Ihre Antwort bearbeiten, um diese Unterschiede zwischen FSM und BT zu erläutern?
Scriptin
1

Sie können Tagging verwenden:

  • Es kann Bewegungsmarken wie "Legen", "Sitzen", "Stehen", "Gehen" und "Laufen" geben. Dann können Sie unrealistische Kombinationen von Tags eliminieren, z. B. "Legen" -> "Laufen" (dazwischen muss "Aufstehen" sein).

  • Andere Tags können Aktivitäten beschreiben: "Schlafen", "Essen", "Jagen" usw. Auch hier ist "Schlafen" -> "Jagen" ohne Zwischenzustände nicht möglich.

  • Da Animationen wie "Aufstehen" vorübergehend sind, kann es eine gute Idee sein, separate Tags für einen Anfang und ein Ende jeder Animation zu haben. Zum Beispiel kann "Aufstehen" ein Übergang von "Sitzen" zu "Bleiben" usw. sein.

Für jede Animation könnten Sie also einige Tags haben:

  • Eine, die die Anfangs- und Endposition / Bewegung beschreibt
  • Mindestens eine, die eine Aktivität beschreibt. Da Aktivitäten auch Übergänge haben, können Sie hier auch Anfangs- und End-Tags haben

Mit diesen können Sie nur mögliche Kombinationen filtern, indem Sie Einschränkungen wie " A->BNur möglich, wenn final_movement_tag(A) == initial_movement_tag(B)" festlegen , was zu einer viel kleineren Anzahl führt. Mit dieser möglichen Kombination können Sie das tun, was Sie beschrieben haben - Wahrscheinlichkeiten hinzufügen. Das Hinzufügen von Wahrscheinlichkeiten kann auf Aktivitäts-Tags basieren, da das Bleiben in derselben Aktivität wahrscheinlicher ist als das Ändern von Aktivitäten.

Mit Tags können Sie möglicherweise die Erstellung aller Übergänge in Ihrem FSM- / Verhaltensbaum automatisieren und später optimieren, wenn Sie mit einigen Kombinationen nicht zufrieden sind.

scriptin
quelle
1

Wenn Sie die umfangreichen Möglichkeiten von Verhaltensbäumen beibehalten möchten, können Sie eine neue Art von zusammengesetztem Auswahlknoten hinzufügen: den Markov-Auswahlknoten.

Sie müssten den Markov-Auswahlknoten selbst implementieren. Abhängig von dem (untergeordneten) Knoten, der zuvor erfolgreich war (oder fehlgeschlagen ist), wird zufällig einer seiner untergeordneten Knoten ausgewählt.

Kasper van den Berg
quelle