So, ihc habe mich mal ein bisschen mit der Forum Suche beschäftigt, und dabei nach der lieben Kollision gesucht.
Jetzt habe ich allerdings aber auch ein paar Fragen dazu:
Ist es richtig, dass ich meine Welt in viele versichedene Boxen einteile, und dann gucke, ob die Spilfigur
eine dieser Boxen trifft (ich lasse strahlen von der Spielfigur abgehen) - Wenn dieser Strahl eine Box trifft,
schaue ich ob er auch ein Dreieck trifft, wenn ja, dann ist eine kollision vorhanden. (Ich weis jetzt nicht, ob ich da richtig
liege - nur verständnishalberweise)
Aber wo genau lass ich den Strahl von der Spielfigur abgehen? Wenn ich es zu hoch mache, kann es sein, dass ich eine
kleine Mauer auf dem Boden nicht erfasse - wenn es zu tief ist, wird ein kleiner Schacht nicht beachtet.
Das war eigentlich schon alles. Wäre nett, wenn ihr posten würdet!
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
Es gibt viele Möglichkeiten um eine Kollisionsabfrage mit der Welt zu realisieren.
Bei einer AABB schießt du am besten eine Gerade von jeder der 8 Eckpunkte in Bewegungsrichtung und prüfst auf Kollision mit einem Face (dabei kannst du in der Regel 1-4 Ecken cullen und Schließt gleichzeitig durch die Ebenenkollision viele Faces aus). Hast du hier noch kein eindeutiges Erbebnis folgt Schritt 2:
Du schießt von jeder Ecke des Face eine Gerade mit invertierter Bewegungsrichtung und prüfst auf Kollision mit der AABB
Wenn du selbst hier noch keinen Kollisionspunkt finden konntest musst du jede Kante der AABB auf Kollision mit jeder Facekante prüfen. Das ganze klingt nun recht langsam, aber du kannst immer eine Menge Berechnungen vermeiden(du musst z.B. nicht jede Kante auf Kollision mit den Facekanten prüfen).
Eine weitere Möglichkeit wäre die Verwendung einer Bounding Sphere. Für diese Methode habe ich mich entschieden, da es mit der oben beschriebenen Methode sehr schwierig war sicher zu stellen, dass man z.B. Stufen erklimmen kann. Dies ist IMHO sehr wichtig, da sich der User nicht immer um alle Unebenheiten auf dem Boden kümmern möchte. Jeder ärgert sich darüber, wenn man z.B. nicht über ein Kabel am Boden laufen kann sondern an diesem hängen bleibt.
Die dritte Möglichkeit wäre so genannte Brushes auf Kollision zu prüfen. Das sind Körper, die allein durch Ebenen beschrieben werden. Liegt dein Zielpunkt hinter allen Ebenen deines Brushs findet eine Kollision statt. Ganz erschlossen hat sich mir dieses Prinzip jedoch nicht. Spiele wie Quake 3 zeigen jedoch, dass es gut funktioniert. Lars kann dir hierzu vielleicht mehr sagen.
Bei allen Varianten kannst du auch sehr viele Faces durch die Verwendung von Octrees bzw. BSP-Trees ausschließen.
Jede Methode hat seine Vor- und Nachteile. Vielleicht brauchst du auch gar keine so genaue Kollisionsabfrage und eine einfachere Variante reicht für deinen Verwendungszweck vollkommen aus. Wichtig ist IMHO aber, dass du jede Methode zu 100% verstanden hast, denn dass ist für die Physik in deinem Programm später sehr wichtig.
_________________ Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650
Das mit den Strahlen zwischen den Eckpunkten der AABB funktioniert nicht immer.
Wenn man eine Kugel verwendet, dann ist es auch nicht schwer eine AABB zu verwenden.
Bei einer Kugel prüft man ja den Radius der Kugel gegen die Fläche. Man verschiebt die Fläche vor der Kollision also in Richtung der Normalen um den Radius der Kugel.
Bei der AABB verschiebt man die Fläche jetzt nicht immer um einen konstanten Wert sondern macht die Verschiebung von der Richtung der Normalen abhängig. Zeigt die Fläche nach oben extruhiert man die halbe Höhe der AABB, zeigt die Fläche nach vorne/zur Seite die halbe Breite usw.. und wenn die Fläche schräg steht mischt man die Werte entsprechend.
Die AABB Kollision ist sehr robust und kostet auch nicht viel.
Wichtig ist, das man zwischen Kollisionerkennung und der Reaktion auf die Kollision unterscheidet. Falls es eine Kollision gibt, dann führt man die Bewegung nicht durch sondern paßt nur die Bewegungsrichtung an.
Wenn man versucht eine fehlerhafte Position nachträglich zurückzusetzen auf die Ebene z.B. o. Ä. bekommt man jede Menge Probleme mit Gleitkommaungenauigkeiten.
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
Ich habe versucht mir die Kollision mit Brushes etwas genauer vorzustellen. So kompliziert wie ich dachte ist das ganze gar nicht (dank deiner Erläuterungen). Ich bin bisher immer davon ausgegangen, dass man irgendwelche Geraden gegen die Ebenen schießen muss.
Der Vorteil dieser Methode ist ihre Geschwindigkeit. Oft liegen mehrere Dreiecke in einer Ebene und bilden ein Face. Bei dieser Methode ist es egal, aus wie vielen Dreiecken sich ein Face zusammen setzt. Man arbeitet am Ende nur mit Ebenen. Außerdem ist sie extrem zuverlässig. Fehler können praktisch keine auftreten.
Bliebe nur noch das Problem Treppensteigen…
Ist es möglich aus einer Reihe von Faces solche Brushes zu bilden, ohne dass man für jedes einzelne Face ein extra Brush bilden muss?
_________________ Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650
Das Treppensteigen löst man so:
Wenn man mit einer senkrechten Wand kollidiert schaut man einfach nach ob man ein Stück weiter oben nicht mehr an die Wand stoßen würden und nimmt dann diesen Weg. Da sich das Objekt natürlich abrupt nach oben bewegt setzt man die Kamera zur Korrektur genau um diese Entferung unter den eigentlichen Punkt für die Kameraposition. Die Korrekturentfernung verkleinert man dann natürlich anhand der verstrichenen Zeit, so daß der ganze Vorgang nur ungefähr 1/4,1/3 Sekunde dauert.
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
Welche Variante du überhaupt nutzen kannst hängt stark von deinem Mapformat bzw. dem Editor mit dem du die Karten erstellst ab. Nutzt du z.B. gtkRadiant hast du die Brushes direkt im Format gespeichert und kannst diese für die AABB-Brush-Intersektion nutzen. Hast du keine Brushes zur Verfügung musst du diese selbst berechnen oder eine andere Variante wählen.
Evtl. hilft dir das hier weiter:
http://www.nathanostgard.com/tutorials/ ... collision/
@Lars:
Vielen Dank für die Tipps. Ich denke jedoch ich werde vorerst bei meiner Methode bleiben, es sei denn ich finde eine Methode effektive Brushes zu berechnen.
_________________ Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.