Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey Leute,
ich benötige für eins meiner Projekte einen Algorithmus mit dem ich viele kleine Schiffe kreisförmig um einen Planeten kreisen lassen kann. Es gibt einen minimalen und maximalen Orbit in dem sich die Schiffe frei bewegen können. Das Ganze soll willkürlich aussehen, das der Eindruck entsteht die Schiffe würden in einem Schwarm agieren. Die Schiffe kennen sich aber untereinander nicht. Bis jetzt ist das so gelöst, das die Schiffe einfach immer gerade aus fliegen und wenn sie den Orbit verlassen eine Kurs Korrektur vornehmen. Das hatte den Effekt das die Schiffe in wellenförmigen Bahnen um die Planeten kreisen. Hier und da noch ein kleines Random bei den Grenzwerten und ich hatte den perfekten Schwarm. So weit so gut. Wenn ich die Schiffe aber jetzt auf einen anderen Planeten schicke haben alle einen ähnlichen Eintrittswinkel und aus meinem schönen Schwarm wurde eine lange Schlange in der alle Schiffe so ziemlich das gleiche machen. Erst nach ein paar Minuten hat sich durch das Random wieder eine Art Schwarmverhalten gebildet. Deshalb jetzt die Frage: Gibt's nen Algorithmus mit der ein Schiff fliegt als wäre es Teil eines Schwarm ohne das dazu die Positionen der anderen Schiffe in seine Berechnungen einbezogen wird?
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Ohne die Positionen der anderen Schiffe zu kennen wird es schwer. Die Frage ist ob die Schwarmoptik ein essentieller Bestandteil deines Projekts ist und ob dir die nötigen Ressourcen es wert sind.
Man kann bei einem Schwarm aber einiges optimieren: - sqrDistance anstatt die Entfernung teuer mittels Wurzelziehen zu berechnen. Solange man nicht auf die "echte" Entfernung angewiesen ist. - nur für Schiffe innerhalb eines bestimmten maximalen Abstands die aufwendigeren Berechnungen durchführen - die Schiffe in Gruppen aufteilen und die aufwendigen Berechnungen nur pro Gruppe durchführen
Alternativ: Könntest du bei den Schiffen beim Flug zu einem anderen Planeten die Flugrichtung etwas variieren? Vielleicht sogar auch die Fluggeschwindigkeit? Dann würden die Schiffe den Zielorbit zu einem anderen Zeitpunkt und/oder in einem anderen Winkel erreichen.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
die Schwarm-Optik ist schon wichtig für das richtige Feeling. Sieht einfach besser aus. Ich hab die Schiffe schon in nem QuadTree, über den sich die Schiffe neue Gegner suchen, also könnte ich den auch für die Schwarm-Berechnung nutzen. Mir ist die Nacht aber noch eine anderer Idee gekommen: Ich wähle einen beliebigen Punkt vor dem Schiff aus, welcher im Orbit des Planeten liegt und lasse das Schiff zu diesem Punkt fliegen. Wenn es angekommen ist fliegt es zum nächsten. Das sollte auch bei Schiffen die ähnliche Werte haben schneller zum Schwarm-Verhalten führen und ist nicht ganz so aufwendig. Noch ein Vorteil: Ich könnte mit diesem Algorithmus das Schiff gezielt auf Gegnerische Schiffe lenken um diese zu bekämpfen. Ich probier das heut Abend mal aus und meld mich nochma ob die Idee funktioniert. Wenn nicht wird's halt doch ein echter Schwarm-Algo.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn du dich doch dafür entscheidest, die Position der Schiffe untereinander mit reinzunehmen, dann kann ich dir noch folgendes empfehlen:
Ein Klassiker für Schwarmverhalten ist, das über Kräfte zu machen. Die Schiffe bekommen untereinander abstoßende und anziehende Kräfte, sodass physikalisch gesprochen ein Potentialminimum in einem gewissen Abstand entsteht.
Das führt dazu, dass die Schiffe versuchen untereinander diesen Abstand zu halten. Gleichzeitig braucht man dann noch etwas, was versucht, sie auf die Kreisbahn zu bringen. Aber natürlich mit weniger Kraft als die abstoßenden/anziehenden Kräfte zwischen den Schiffen. Das kann man entweder machen, indem man ein paar "Leader" auswählt die halt immer fix auf der Kreisbahn fliegen, während alle anderen nur von den Kräften untereinander gesteuert werden oder durch eine Kraft sie immer Richtung dem nächsten Punkt auf der Kreisbahn zwängt oder solche späße.
Wenn du den Ansatz weiter verfolgen willst, finde ich sicher nen Paper dazu, ich hab dazu schonmal was gehört irgendwo.
viele Grüße, Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Das mit den Random-Punkten im Orbit des Planeten funktioniert wunderbar. Ich denke ich bleib bei der Methode. Die ist performant und erzeugt das gewünschte Verhalten
Mitglieder in diesem Forum: 0 Mitglieder und 15 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.