Wie kann man in einem Spiel „Duftpfade“ modellieren?

11

Angenommen, Sie möchten ein 3D-Spiel erstellen und haben entweder Spieler oder Handys in der Lage, andere Entitäten zu verfolgen, indem Sie ihren Geruchspfaden folgen. Gibt es eine bekannte Datenstruktur, die diesem Anwendungsfall entspricht?

Wenn nur wenige Personen unterwegs sind, können Sie wahrscheinlich so etwas wie eine Karte der 3D-Koordination mit der Entitäts-ID erstellen, aber der echte Duft funktioniert anders, da er mit der Zeit, aber langsam, verblasst. Und die meiste Zeit kann man nur ungefähr wissen, was dort hingegangen ist und wie viele Dinge dieser Art dort hingegangen sind. Und die Annäherung wird mit der Zeit am schlimmsten, bis sie weg ist.

Ich stelle mir vor, es ist so, als würde man mit einer exakten Zahl beginnen und langsam die niedrigstwertigen Ziffern verlieren, bis man auch die höchstwertige Ziffer verliert. Das hilft mir aber nicht wirklich, da Entitäts-IDs normalerweise nicht so codiert sind, dass sie zusätzlich zu ihrer individuellen ID den Entitätstyp enthalten.

Sebastien Diot
quelle
Dwarf Fortress macht so etwas in der nächsten Veröffentlichung.
Russell

Antworten:

10

Es gibt viel Abwechslung, wie Sie dies tun können; Ich werde die für mich offensichtlichen Entscheidungen vorschlagen, aber es gibt viele Variationen, die entworfen werden könnten. Haftungsausschluss: Ich habe so etwas noch nicht implementiert.

Zunächst benötigen Sie eine Datenstruktur, die Ihre Welt abdeckt. Wenn Sie NPC-Bewegungen in einem 3D-Raum ausführen, haben oder benötigen Sie wahrscheinlich eine solche Struktur für Pfadfindungszwecke - beispielsweise ein Navigationsnetz. Nehmen wir also an, wir können dem ein Feld für Düfte hinzufügen.

Also, was setzen wir in diesem Bereich? Ich schlage eine Liste von Aufzeichnungen vor ( Geruch , Stärke , Zeit ). Diese Liste wird auf oder unter einer maximalen Länge gehalten und nach Stärke sortiert - so werden schwache Düfte verworfen. Der Duft kann entweder explizit für jede Entität oder jeden Entitätstyp definiert sein oder einfach der Entitätstyp - je nachdem, was Sie eindeutig verfolgen möchten. Die Zeit ist ein Zeitstempel, zu dem dieser Duftdatensatz zuletzt aktualisiert wurde.

Wenn eine Entität einen Bereich durchläuft (z. B. ein bestimmtes Dreieck des Navigationsnetzes), ist es Zeit, die Duftliste zu aktualisieren. Erstens verringert alle Stärken entsprechend die Menge an Zeit vergangen nach dem Zeitwert gegenüber der aktuellen Zeit - exponentieller Abfall hier wahrscheinlich eine vernünftige Wahl ist. Fügen Sie dann den Duft der aktuellen Entität zur Liste hinzu, möglicherweise mit einer Stärke, die vom Entitätstyp abhängt. Wenn die Liste dann zu lang geworden ist, verwerfen Sie die niedrigste Stärke.

Um ein Tracking-Ergebnis zu erhalten, suchen Sie den Duft in der Liste für den aktuellen Standort, machen Sie dasselbe für alle Nachbarn und gehen Sie in Richtung des stärksten Geruchs (das ist nicht die Richtung, aus der der Tracker gerade gekommen ist).

Für zusätzlichen Realismus:

  • Diffusion: Übertragen Sie regelmäßig einen Teil des Duftes an jedem Ort an seine Nachbarn. Dies verwirrt die Wege, bedeutet aber auch, dass stationäre Dinge aufgespürt werden können (Auffinden von Nahrungsmitteln, Leichen usw.). (Es ist sogar eine anerkannte Art von KI, Aktionen vollständig auf diese Art von Informationen zu stützen. Die Landschaft bietet Informationen darüber, wie eine bestimmte Ressource usw. beschafft werden kann. Ich vergesse den Namen.) Der Hauptnachteil ist die aufgewendete Zeit Berechnung der Diffusion überall.

  • Starke Düfte sollten die Erkennung schwacher Düfte verhindern. Teilen Sie die Stärke des gesuchten Duftes durch die Stärke des stärksten Duftes und scheitern Sie, wenn er zu klein ist. Dies könnte es ermöglichen, die eigene Geruchsspur absichtlich zu verwirren.

Kevin Reid
quelle
9

Ich würde eine Technik namens Einfluss-Mapping modifizieren, um eine Karte für Düfte zu erstellen. Es wird sich auf natürliche Weise auflösen und verblassen, sich mit anderen Düften vermischen und konkurrieren und wahrscheinlich mehr. Das hört sich so an, als würde es genau das tun, was Sie brauchen, aber es ist möglicherweise aufwändiger als das, was Sie implementieren möchten. Zumindest sollte es Ihnen einige gute Ideen geben, und es ist ziemlich einfach, es zusätzlich zu der Struktur zu implementieren, die Sie gerade verwenden.

Ein Tutorial / eine Erklärung fand ich hilfreich.

jsonnull
quelle