Jump to content
Unity Insider Forum

3D Kollisionsvermeidung (KI)


CBif

Recommended Posts

Hi,

 

da ich nicht wusste wohin sonst (eine AI Sektion habe ich hier jedenfalls nicht gefunden), setze ich das mal hier hinein.

 

Ich habe hier so ein paar Objekte, die sich relativ frei im 3D-Raum umher bewegen können sollen (-> Raumschiffe). Ich grübele nun jedoch schon ein Weilchen darüber nach, wie man diesen Raumschiffen nun beibringen kann, sich dabei nicht ständig gegenseitig über den Haufen zu fliegen wenn sich die Wege kreuzen oder halt einfach eines im Flugweg des anderen herumlungert. Dabei sind die Größen der Objekte auch höchstgradig unterschiedlich (Mini-Raumjäger vs. Riesen-Schlachtschiff), sowie die Ausrichtung der Schiffe auch prinzipiell total frei. Dabei sollte auch nicht all zu verschwendend vorgegangen werden, gerade kleinere Schiffe sollen also nicht riiiiiiiiiesen Kurven fliegen, wenn es eigentlich nicht nötig ist.

 

Irgendwie müsste man ja eine Art Kollisionsvermeidung (bzw. Kurzstrecken-Pathfinding) implementieren. Ich will jetzt hier auch kein fertiges Skript vorgesetzt bekommen, jedoch fehlt mir da einfach der grobe Ansatz, wie man das einigermaßen intelligent umsetzen könnte, so dass sich die Schiffe nicht all zu dumm umfliegen. Hat jemand schon einmal so etwas gemacht oder spontan eine Idee für solch einen dynamischen Fall (-> (fast) alle Objekte können sich bewegen etc.)?

 

Danke schon mal für alle Tipps!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich sehe da auf anhieb 2 Möglichkeiten.

Entweder du nimmst einen Raycast und fragts zyklisch die Umgebung vor die ab, oder deine Schiffe bekommen alle einen Trigger, der einiges größer als das Schiff selbst ist.

Bei beiden Varrianten haste das Ereignis, dass dein Schiff nah an dem anderen Schiff ist. Jetzt musst du dir natürlich noch ausdenken, was dann passieren soll. Soll eine Linkskurve geflogen werden oder soll erstmal geschaut werden welcher weg der bessere ist...

 

Da eine gescheite Logic einzubauen kann recht aufwendig werden. Ich würde aber ersteinmal mit nem Trigger anfangen und das erste mögliche Manöver generieren. Später kann man ja die ganze Sache verfeinern. So sollte man z.B. unbedingt in Erfahrung bringen, in welche Richtung das andere Schiff fliegt, weil das ja entscheidend für das Ausweichmanöver ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, in diese Richtung habe ich auch schon überlegt. Beim Raycast wäre ja das grundsätzliche Problem zu überlegen, wie ein "Treffer" dann auch sichergestellt werden kann. Insbesondere wenn man versucht mit einem größeren Objekt an einem kleineren vorbei zu fliegen müsste man ja sehr viele Strahlen aussenden um das Kleinere überhaupt zu erkennen UND dann noch sicher zu gehen, dass man genügend Abstand (entsprechend der Größe des Schiffes) einhält.

 

Eine Triggerbox (oder Sphere) macht die Sache da sicherlich erstmal einfacher. Vermutlich kann man es dann später ja auch noch kombinieren und/oder noch andere Techniken mit hinein bringen. Ich denke ich werde damit erstmal anfangen. Bleibt die Frage, wie ich nach der Annäherungserkennung die Schiffe noch aneinander vorbei fliegen lasse (ohne zum Beispiel gleich in das Nächste hinein zu fliegen).

 

Ich hatte mal in den Code von Homeworld hinein geschaut und verstehe langsam, warum die Codedateien für die Movement-AI besonders umfangreich war. Aber irgendwo muss ja auch eine Herausforderung bleiben. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Genau! Deswegen sag ich ja, dass du erst einmal hinbekommen musst, dass das Schiff ausweicht. Wenn das funktioniert, könntest du daraus ne hübsche Funktion machen.

Natürlich kommt dann der nächste Schritt: Ist etwas in meiner neuen Flugbahn...

 

Wenn dein Raumbereich nicht zu groß ist, bietet sich auch an, den raum in Quadranten zu unterteilen. Sozusagen ein 3 dimensionales Array. Da hättest du schon mal eine grobe Auflistung wo sich ein Schiff befindet. Natürlich muss jedes Schiff dem Array sagen wo es jetzt ist und wo es vorher war, damit das Raster immer hübsch aktualisiert wird. Bei der Rastergröße kann ich nicht genau sagen, welche die Beste wäre. Sollte es so groß sein, wie das größte Schiff? Oder eher wie ein mittleres Schiff?

Na ja, egal wie, über die Quadranten würde dein Schiff schon mal erkennen, ob in der Flugbahn ein Hindernis wartet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn dein Raumbereich nicht zu groß ist, bietet sich auch an, den raum in Quadranten zu unterteilen. Sozusagen ein 3 dimensionales Array.

Wobei mir da gleich in den Sinn kommen würde, dass man das auch gleich in eine Art Octree-System erweitern könnte. Was auch allgemein eigentlich gar nicht so unpraktisch klingt. Hm...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...