So, ich hab mal wieder ein WeWechen, diesmal gehts um die Kollisionsberechnung, und zwar zum überprüfen, ob ein Punkt in einer beliebig transformierten Box liegt. Dazu hab ich mir mal eben dieses Tutorial angeschaut, irgendwo in der Mitte bis unten findet man einen Absatz über das, was ich eigentlich vorhab. Im Grunde wird halt jedes Polygon der Box durchgegangen und überprüft, ob der Punkt vor oder hinter dem Polygon liegt. Liegt der Punkt bei jedem Polygon der Box hinter dahinter, so liegt der Punkt selbst auch in der Box. Nur bin ich mir da über einige Sachen noch nicht ganz im Klaren. Zumal das auch nicht klappt, mit der Überprüfung.
Hier meine Version der überprüfung, ich hab dazu sone Art Kollisions-Map erstellt, kompliziert, ich weiß, aber ich machs numal so...
Code:
for i:=0to coll_map.objects-1dobegin//Alle Boxen der Koll.-Map durchgehen
collision :=true;
for a:=0to5dobegin//Alle Polygone der Box durchgehen
V5[0]:=vectorsub(p, V6)[0];// entspricht P - Boxpunkt
V5[1]:=vectorsub(p, V6)[1];
V5[2]:=vectorsub(p, V6)[2];
if VectorAffineDotProduct(v4,v5) >=0then collision :=false;// wenn Skalarprodukt aus Normalvektor und ( P - BoxPunkt ) > 0, dann Kollision...
end;
In sofern hab ich keine Ahnung, ob das mathematisch seine Richtigkeit hat, das Skalarprodukt, worum es sich hier wohl handelt, hab ich hier das erste mal gehört.. Somit weiß ich auch nicht, ob dieses hier auch angebracht ist, ob man das damit ausrechnen kann. Ich vertraue aber mal darauf, dass das so richtig ist....
Naja, die Kollision funktioniert nicht! Der Algorithmus erscheint logisch, bis auf dein paar stellen, bspw. der, wo die Differenz aus P (dem Punkt, auf den Kollision untersucht werden soll) und dem ersten PolygonEckPunkt gebildet wird. Kann man da einfach so den ersten nehmen oder führt das zu Ungenauigkeit?
Sollte dieser Algorithmus funktionieren, theoretisch? Wenn nicht, wie müsste es richtigerweise heißen? Könnte durchaus sein, dass ich hier und da ein paar Logikfehler eingebaut hab, das habe ich so an mir...
Sorry für die vielen Umformungen, bei Gelegenheit muss ich das mal korrigieren.
Prinzipiell ist der Algorithmus in Ordnung und funktioniert für jedes konvexe Objekt.
Voraussetzung ist aber, dass tatsächlich alle Polygone richtig herum orientiert sind (oder in deinem Fall zumindest die Normalvektoren in die richtige Richtung weisen).
Was mir bei deinem Algorithmus auffällt:
Wenn das alles ist, kollidierst du zwar gegen mehrere Boxen, collision liefert aber nur das Ergebnis der Kollision mit der letzten Box zurück (abgesehen davon, dass du die Schleife sofort abbrechen könntest, sobald collision zum ersten Mal auf false gesetzt wird).
Ausserdem solltest du mit deinen Datentypen ein wenig aufräumen: einmal hat die erste Komponente eines Vektors den Index 0, dann wieder 1 - wenn du dir einen Vektortyp pro funktionaler Einheit (etwa drei und vierdimensionale Vektoren) definierst, und dabei bleibst, sparst du dir
a) viel Schreibarbeit beim Konvertieren
b) Fehlermöglichkeiten
Mitglieder in diesem Forum: 0 Mitglieder und 19 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.