OpenGL - Figur auf Landschaft bewegen

Die Höhe musst du maximal 3 Mal errechnen, das geht aber so schnell (vorausgesetzt, du kannst die Dreiecke, gegen die du den Strahl testen musst auf ein Minimum reduzieren durch schnelles Culling), dass das kaum Einfluss hat. Du errechnest die gedrittelten Punkte, berechnest die Höhe für den ersten, berechnest wie weit es ist bis dahin und ziehst das von der Schrittlänge ab. Im Idealfall hast du dann schon die gewünschte Schrittweite und musst die nächsten 2 Berechnungen gar nicht mehr machen. Ansonsten berechnest du noch den zweiten Punkte und zählst auch den Weg vom ersten zu diesem ab und schaust, ob du immernoch mehr brauchst....

Je mehr du unterteilst, desto besser schmiegt sich dein Objekt an die Steigung an.
 
Hallo Leute =)

ich habe mal etwas weiter gedacht was die Kollision beim Bewegen einer Figur angeht und würde gerne mal eure Meinung dazu hören. Ist das der richtige Ansatz? Kann ich irgendwo unnötige Berechnungen einsparen? etc...

Im Anhang habe ich mal 4 Bilder hinterlegt auf denen meine Methode ist.

Bild 1 (Schritt 1):
Die schwarzen Linien geben die Geometrie an (Die vertikale schwarze Linie soll eine Wand darstellen die nicht durchdrungen werden darf)
Die beiden Roten Punkte sind sozusagen der Kopf und die Füße der Figur.
Die grüne Linie unten gibt den maximalen Bewegungsradius der Figur auf ebener Fläche an.
Die gelben Linien sind die Kollisionslinien (grüne Linie gedrittelt)
Die pinken Punkte deren Kollisionspunkte auf dem "Boden"
Und die hellblauen Linien sind die "fast" richtige Distanz die zurückgelegt wird.
Beschreibt im Grunde die Methode die Cromon weiter oben schon beschrieben hat.

Bild 2 (Schritt 2):
Hellgraue vertikale Linie: Ist sozusagen ein Begrenzungsradius damit die Figur nicht zu dicht an die Wand herankommt, weil sonst Geometrie auf der anderen Seite der Wand sichtbar wäre bei einer Kollision (sollte klar sein denke ich)
Hellblaue Linie: Gibt den Radius an.

Im 2. Schritt meiner Methode führe ich eine horizontale Kollision durch (gelbe Linie) die in dem Fall auf der Wand stattfindet. Die gelbe Linie geht immer von den XYZ Koordinaten des "Kopfes" der Figur bis zu den XZ Koordinaten (auf Höhe der Y Koordinate vom Kopf) des Kollisionspunktes aus Schritt 1.
Wenn keine Kollision stattfinden würde, würde die Berechnung hier enden und die Figur auf den Kollisionspunkt von Schritt 1 gesetzt.

Bild 3 (Schritt 3):
Schritt 3 wird nur ausgeführt, wenn bei Schritt 2 eine Kollision auftrat.
Hier wird vom Kollisionspunkt aus Schritt 2 in Richtung der Anfangsposition der Figur um den Begrenzungsradius (hellblaue Linie) zurückgegangen. An dieser Position wird dann eine weitere Kollisionsberechnung durchgeführt und der Kollisionspunkt bestimmt.

Bild 4 (Schritt 4):
Hier wird ganz einfach die Position der Figur auf den Kollisionspunkt aus Schritt 3 gesetzt.
Die graue Linie liegt nun direkt auf der vertikalen schwarzen (die Wand) und somit bleibt die Komplette Figur hinter der Wand...Zumindest habe ich mir dass so gedacht^^


Ich weiß meine Erklärungskünste sind echt mau aber ich hoffe Ihr habt trotzdem verstanden wie ich es meine.

MfG Manuel
 

Anhänge

  • figur 1.png
    figur 1.png
    11,5 KB · Aufrufe: 6
  • figur 2.png
    figur 2.png
    10,8 KB · Aufrufe: 4
  • figur 3.png
    figur 3.png
    9,3 KB · Aufrufe: 2
  • figur 4.png
    figur 4.png
    9,8 KB · Aufrufe: 7
Zuletzt bearbeitet:
Also ich würde folgenden Ansatz verwenden:
Für eine Wand kannst du ja ganz einfach eine AABB (axis aligned bounding box) verwenden. Deine Figur hat auch ein passendes Bounding Volume (vielleicht Kugel oder auch AABB) die aber auch berücksichtigt, dass die Figur nicht näher als einen gewissen Abstand mit einem anderen volume interagieren darf. Dann prüfst du einfach für jeden der 3 Punkte ob zwischen dem letzten und dem nächsten Punkt das Volumen deiner Figur eine der Seiten der AABB der Wand durchstösst (ist bisschen Mathematik, gibt zumindest in DirectX dafür sogar schon vorgefertigte Objekte) und in welcher Distanz. Dadurch hast du den absolut genauen Aufstosspunkt und kannst die Bewegung abbrechen.
 
Hm aber so müsste ich ja für jede Wand eine Bounding Box anlegen. Ist etwas schwierig bei komplexen Objekte denke ich oder?
 
Grundsätzlich schon, ja. Ist aber hier dann wieder die Frage, wie genau es sein muss. Je mehr du deine Geometrie in kleinere Objekte mit Volumina unterteilst desto genauer wird dann am Schluss die Kollision sein.

Eine Möglichkeit, die ich verwende ist, dass ich einen Baum verwende für komplexe Objekte. Dabei ist die Wurzel des Baumes ein Kollisionsvolumen das das ganze Objekt beinhält. Die Blätter sind dann jeweils Volumina kleinerer Grösse bis zu einer fixen Minimalgrösse. Dadurch kannst du die nötigen komplexeren Volumina genau aussortieren. Für die Performance sind dann auch die ersten paar Ebenen des Baumes relativ ungenaue Volumina die dafür sehr leicht und schnell gecheckt werden können.

Um schnell das Terrainstück aussortieren zu können, das du für den Kollisionscheck bzgl. der Höhe kannst du einen Quadtree verwenden, dieser eignet sich von der Struktur her recht gut.
 
Zurück