Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.02.2011, 02:57

Sweep and Prune

Hallo.

Könnte mir jmd erklären, wie Sweep and Prune genau funktioniert? Ich finde zwar viele Informationen dazu im Internet, aber nicht wirklich was, das mir weiter hilft. So wie ich das bisher verstanden hab, werden die Bounding Boxes nach dessen minimum Werten sortiert. Wenn ich nun testen will, ob etwas mit meiner BoundingBox kollidiert, fange ich mit jeweils mit dem Minimum Wert meiner BoundingBox an, und gehe die Liste durch, bis ich den Maximum Wert meiner Box überschritten hab. Wenn auf allen 3 Achsen eine Kollision statt findet, dann hab ich eine Kollision mit der jeweils anderen Box.

Nun geht das für mich aber nicht wirklich auf. Denn was ist, wenn meine Box von einer anderen Box komplett eingehüllt wird?

Oder habe ich Sweep and Prune völlig falsch verstanden? Werden bei dem Algo die Körper nicht als gefüllte Körper behandelt, sondern nur als Hüllen? D.h. nur die Hülle(oder auch Overfläche) wird auf Kollision überprüft, und nicht das gefüllte?

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Mastermind

unregistriert

2

18.02.2011, 08:04

Was wäre denn die physikalisch korrekte Reaktion, wenn du feststellst dass ein solider Stahlblock komplett in einem soliden Stahlblock steckt? Der Fall darf einfach nicht vorkommen.

3

15.04.2011, 13:44

Ich hab mal S+P implementiert. Der Knackpunkt ist dass du die Änderungen der Konfiguration bewertest, nicht eine Situation an sich.
Nehmen wir mal an, du hast zwei Körper, von denen einer kleiner ist als der andere. Sie überschneiden sich zu Anfang weder in x noch in y-Richtung. (Ich beschränke mich mal auf 2 Dimensionen).
Die Körper seien A und B, mit Bounding-Boxes A1-A2 und B1-B2.
Am Anfang ist die
x-Achse: A1, A2, B1, B2
y-Achse: B1, B2, A1, A2
nun bewegt sich das kleinere A in x-Richtung, bis es hinter B verschwindet. Es passiert hinter B und erscheint wieder. Dabei passieren in den Listen folgende Ereignisse:
A1, A2, B1, B2 -> A1, B1, A2, B2 : A2-B1 tauschen Plätze, Kollision!
A1, B1, A2, B2 -> B1, A1, A2, B2
B1, A1, A2, B2 -> B1, A1, B2, A2
B1, A1, B2, A2 -> B1, B2, A1, A2 : A1-B2 tauschen Plätze, Ende der Kollision

Anders gesagt: Sobald sich ein Ende einer Box zwischen den Enden einer anderen Box befindet hast du eine Kollision. Du führst immer sortierte Listen der Enden und Listen der in jeder Dimension gerade überlappenden Boxen.

Werbeanzeige