Algorithmen zur Kollisionserkennung
Kollisionserkennung
- In der Videospielprogrammierung ist Kollisionserkennung ein sehr häufiges Problem
- Sie ist unverzichtbar, damit Charaktere nicht durcheinander hindurchgehen und um eine Physik-Engine zu implementieren
Einfacher Ansatz 🐥
Performance-Probleme
- Je mehr Objekte es gibt, desto eher treten Performance-Probleme auf
- Zum Beispiel müssen bei n = 20 insgesamt 190 Paare geprüft werden
Verbesserte Lösung
Optimierung durch Sortieren
- Wenn die Objekte nach ihren x-Koordinaten sortiert werden, lassen sich unnötige Prüfungen reduzieren
- Codebeispiel:
sortByLeft(balls);
for (let i = 0; i < balls.length; i++) {
const ball1 = balls[i];
for (let j = i + 1; j < balls.length; j++) {
const ball2 = balls[j];
if (ball2.left > ball1.right) break;
if (intersects(ball1, ball2)) {
bounce(ball1, ball2);
}
}
}
Performance-Analyse
- Sortieren: O(n log n)
- Innere Schleife: im Durchschnitt O(n + m) (m ist die Gesamtzahl der Überlappungen auf der x-Achse)
- Endgültige Zeitkomplexität: O(n log n + m)
Visueller Vergleich
- Vergleich zwischen globaler Paarprüfung und sortierter Paarprüfung
- Die sortierte Paarprüfung führt deutlich weniger Prüfungen aus
Zusammenfassung von GN⁺
- Dieser Artikel behandelt, wie sich Algorithmen zur Kollisionserkennung in der Spieleentwicklung optimieren lassen
- Er beginnt mit einem einfachen O(n^2)-Algorithmus und verbessert die Performance durch Sortierung deutlich
- Sehr nützliche Informationen für Spieleentwickler oder Softwareingenieure
- Andere Projekte mit ähnlicher Funktionalität sind unter anderem Box2D und Bullet Physics
1 Kommentare
Hacker-News-Kommentare
Der Autor schlägt vor, für optimale Leistung „schnelle“ Sortieralgorithmen wie Mergesort oder Quicksort zu verwenden.
Ich habe in der Vergangenheit etwas Ähnliches gemacht, aber statt zu sortieren eine Indexliste für jede Richtung gepflegt.
objectIndicesSortedByLeftEdge/RightEdge/TopEdge/BottomEdge.leftEdgeundrightEdge.Dieser Artikel ist wirklich gut aufbereitet.
Ich lese Dokumentationen zur kontinuierlichen Kollisionserkennung immer gern.
Der Einsatz von Illustrationen war gut.
Teil 2: https://leanrada.com/notes/sweep-and-prune-2/
Ich stelle die Aussage infrage: „Dieser einfache Algorithmus läuft in O(n^2) Zeit in Big-O-Begriffen“.
Ich habe mich gefragt, ob diese Methode dem Einsatz eines Quadtrees ähnelt, um potenzielle Kollisionen zu reduzieren.
Ich habe mich gefragt, ob jemals ein Linear-Programming-Ansatz vorgeschlagen wurde.
Ich habe mich auf dieser Website im positiven Sinne verzettelt.