Schwarm
Aus CINEMA 4D Wiki
Dieser Artikel zeigt Methoden auf, das Verhalten von Schwärmen zu simulieren.
Im Folgenden werden die Mitglieder des Schwarms Einheiten (engl. Boids) genannt.
Inhaltsverzeichnis |
Konzept
Die folgenden Regeln sollten bei korrekter Einhaltung zu einem Schwarm-ähnlichen Verhalten führen:
- Hindernissen ausweichen
- Einheiten versuchen, statischen Hindernissen auszuweichen, die sich in der Umgebung befinden. Hindernisse werden identifiziert, indem die Einheit einen Strahl in Bewegungsrichtung aussendet. Ein Objekt wird als Hindernis angesehen, wenn es sich innerhalb einer gewissen Prüfzone in Flugrichtung befindet. Diese Prüfzone wird größer, je schneller sich die Einheit bewegt.
Die Ablenkung der Flugrichtung ergibt sich aus dem Normalenvektor der Oberfläche des Hindernisses, der invers mit der Entfernung zwischen Einheit und Hindernis gewichtet wird.
- Verfolgung
- Die Einheit findet ihren nächsten Nachbarn und versucht, ihn zu verfolgen. Dies geschieht indem die eigene Position an die des Nachbarn angeglichen wird.
- Anderen Einheiten ausweichen
- Die Einheit versucht, Zusammenstöße mit ihren Nachbarn zu vermeiden. Die Einheit findet ihren nächsten Nachbarn und prüft, ob der Nachbar näher ist, als der definierte Mindestabstand erlaubt. Wenn ja, wird eine Veränderung der Flugbahn vorgenommen, invers-quadratisch gewichtet zur Entfernung der beiden Einheiten zueinander. Durch die invers-quadratische Wichtung wird die Reaktion heftiger, je näher sich zwei Einheiten kommen.
- Schwarm zusammenhalten
- Die Positionen der näheren Nachbarn der Einheit werden gemittelt, und die Einheit versucht an diese Position zu gelangen. Die Wichtung hierbei ist normaler Weise eine Konstante mit geringem Wert.
- Angleichen der Geschwindigkeit
- Die Einheit findet ihren nächsten Nachbarn und ermittelt den Bewegungsvektor des Nachbarn. Diesen übernimmt sie mit einer geringen Wichtung.
- Zielverfolgung
- Jede Einheit hat eine individuelle Zielposition und -Richtung. Außerdem hat jede Einheit ein Flag um festzulegen, ob sie überhaupt eine Position oder Richtung anpeilen soll. Für eine Position verwendet die Einheit einen Vektor zum Ziel. Für eine Richtung gilt ein entsprechender Richtungsvektor. Beide werden jeweils von einer konstanten Wichtung beeinflusst. Die Position kann in jedem Frame erneut gesetzt werden, so dass die Einheit z.B. die Hand des Benutzers, oder eine andere Einheit verfolgt. Da dieser Vorgang von niedriger Priorität ist, modifiziert er lediglich die bereits existierenden Schwarm-Verhaltensweisen. Die Einheiten haben weiterhin ein Flag, welches anzeigt ob sie vor dem Ziel flüchten sollen. In dem Fall wird der verwendete Vektor einfach negiert.
- Fluggeschwindigkeit
- Die Einheit versucht eine konstante Fluggeschwindigkeit zu halten (typischer Weise 0,2 * maximal mögliche Geschwindigkeit). Um zu hohe oder zu niedrige Geschwindigkeit auszugleichen, wird der zurückgegebene Vektor entweder entlang der Bewegungsrichtung (bei zu langsamem Flug) oder entgegen der Bewegungsrichtung (bei zu schnellem Flug) berechnet.
- Level flight
- Die Einheit versucht, horizontal zu fliegen. Der zurückgegebene Vektor ist das Negativ der vertikalen Beschleunigung.
Software
Programme und Expressions, die sich an den oben abgebildeten Regeln orientieren:
- TP Simple Swarm (implementiert nicht alle oben genannten Regeln und ist größtenteils Fake über Kraftfelder)
Hinweise
- Mit ThinkingParticles ist dieses Konzept nicht einfach bzw. nur mit großen Performanceeinbußen umsetzbar, da es keine Möglichkeit gibt, die nächsten x Nachbarn eines Partikels zu ermitteln. Dies könnte nur über einen umständlichen Vergleich mit einem PassAB-Node erledigt werden, was aber nicht wirklich praxistauglich ist.
Eine Lösung wäre z.B. ein spezielles Pass-Node in C++ zu entwickeln, welches einen Partikelstrom mit den x nächstgelegenen Partikeln ausgibt.
