2009-01-05 12 views
13

Von Anfang an fühlt sich die Kollisionserkennung an wie ein O (n^2) Problem.Welche Technik sollte verwendet werden, um 2d Kollisionsprüfungen zu bereinigen?

Sie haben eine Reihe von Objekten und Sie müssen überprüfen, ob jedes Objekt mit einem der anderen Objekte kollidiert. Ich weiß jedoch, dass es sehr ineffektiv ist, jedes Objekt gegen alle anderen Objekte zu prüfen. Warum sollte eine relativ teure Kollisionsprüfung zwischen zwei Bällen stattfinden, wenn sie nicht einmal nahe beieinander sind?

Hier ist Beispiel meines einfachen Programms arbeite mich an:

alt text

Wenn Sie 1000 Kugeln haben dann, wenn Sie mit der naiven Kollisionserkennung gehen würden Sie 1000^2 Sammlung überprüft haben (a Million)! Diese Kollisionsprüfung wurde schnell zum Engpass in meiner Anwendung. I benötigen, um einige umfassende Phasenschnitt zu implementieren.

Welche Techniken sollten verwendet werden, um Kollisionskontrollen bei der Arbeit mit 2D - kreisförmigen Objekten zu reduzieren? Ich habe über QuadTrees, BSP, räumliches Hashing usw. gelesen, aber es ist schwierig herauszufinden, welche Methode für diesen Anwendungsfall am besten geeignet ist.

Weiß jemand, was am besten funktioniert?

Antwort

6

Ich würde QuadTrees oder irgendetwas, das kompliziert ist, nicht verwenden, weil Sie ständig balancieren und Bäume ausgleichen werden, während sich Bälle zwischen ihnen bewegen. Es wäre wahrscheinlich effizienter, nur ein Gitter zu haben - jedes Mal, wenn Sie einen Ball bewegen, können Sie einfach berechnen, in welcher Gitterzelle er sich befindet, und ihn dort hineinwerfen, wenn er sich ändert. Und jedes Mal, wenn Sie eine Kollisionsprüfung durchführen müssen, können Sie einfach Bälle überprüfen, deren Mittelpunkt sich entweder in Ihrem Gitter befindet, oder in benachbarten, wenn Sie ausreichend nahe an der Kante sind.

Sie können mit der Gittergröße experimentieren, um das Optimum zu finden. Sie können feststellen, dass es davon abhängt, wie viele Bälle Sie haben.

Ich sagte dies in einem Kommentar unten, aber ich denke, es verdient, ein Teil der Antwort zu sein: Nur Kollisionserkennung, wenn etwas bewegt, so müssen Sie nur das bewegende Ding gegen Dinge in seinem Rasterfeld überprüfen (und (wie oben erwähnt). Auf diese Weise werden die Objekte, die sich nicht bewegen, auf keinen Fall auf Kollisionen überprüft, da sich in ihrem Raster nichts bewegt und auch nichts in ihr Gitter hinein oder hinaus bewegt wird.

+0

Die zugehörigen Fragen zu meiner Antwort hinzugefügt und die Frage aus der Antwort entfernt, da sie ablenkend wirkt. – mmcdole

+0

Schön gemacht, @ Simucal. –

2

Ich zweite die Grid-Methode. Eine 2D-Simulation von Bällen wird nicht von QuadTrees (die im Allgemeinen verwendet werden, wenn Sie komplexe Geometrie wie Charaktere und Gebäude haben) oder BSPs (die Sie wählen sollten, wenn Sie eine sehr ungleichmäßige Verteilung/Konzentration von Objekten haben, wie mit hoher Konzentration Bereiche und Bereiche mit geringer Konzentration, in einem Multiplayer oder Strategiespiel)

+0

Wenn Sie das Bild oben betrachten, würden Sie sagen, dass das eine ungleichmäßige Konzentration darstellt? Oftmals ist das Fenster viel größer, und die Kugeln befinden sich unten. Würden Sie immer noch Gitter über BSP vorschlagen? – mmcdole

+0

Ein BSP ist ein unregelmäßiges Gitter, und ich schlage ein regelmäßiges schachähnliches Gitter vor. Der Unterschied liegt darin, dass ein schachähnliches Grid im Vergleich zu einem BSP einfach zu implementieren und zu debuggen ist und sogar für professionelle Spiele mehr als geeignet ist.Du könntest dein Grid zu einem BSP upgraden, wenn Leistung ein Problem ist, oder als persönliche Herausforderung –

+0

In deinem Fall ist die Konzentration tatsächlich uneinheitlich, unten hast du viele Bälle und oben sind weniger Bälle. Sie können also eine feinere Rastergröße verwenden, die eine Anwendung des Expertenwissens ist, da Sie wissen, was Sie erwartet, und es ist keine wirklich generische Situation, wie eine Billardtabelle. –