Teil 1 – Einführung
Teil 2 – Kollision mit Gerade
Teil 2 – Kollision mit Gerade – Demoprogramm
Teil 3 – Kollision mit Strecke
Teil 3 – Kollision mit Strecke – Demoprogramm
Übersicht:
So jetzt wissen wir was wir brauchen. Damit fangen die Berechnungen auch schon an. Zusätzlich brauchen wir aber noch den Lot von der Begrenzungslinie zu den beiden Zielpunkten und
. Der Lot zu
sollte eine Länge von
, also dem Radius des Figurenkreises haben, damit die Figur die Begrenzungslinie gerade so nicht überschreitet. Die Länge des Lotes zu
bezeichnen wir mit
.
Das führt uns zu folgender Skizze des zu Grunde liegenden mathematischen Problemes:
Die gepunktete Seite unter der Geraden ist der abzugrenzende Bereich.
Nochmal eine Zusammenfassung aller Variablen:
Startpunkt | |
Bewegungsvektor | |
unkorrigierter Zielpunkt | |
korrigierter Zielpunkt | |
Radius der Figur | |
Abstand des unkorrigierten Zielpunktes zur Begrenzungskante | |
Abstand des unkorrigierten Zielpunktes zum korrigierten Zielpunkt | |
Gerade, die von |
|
Gerade, die von |
|
Winkel zwischen den Geraden |
|
Normale zur Geraden |
|
Normale zur Geraden |
|
Schnittpunkt des Lotes mit dem korrigierten Zielpunkt | |
Schnittpunkt des Lotes mit dem unkorrigierten Zielpunkt | |
Erster Endpunkt der Begrenzungskante | |
Zweiter Endpunkt der Begrenzungskante |
Wichtig ist dabei noch zu erwähnen, dass die Endpunkte der Begrenzungskanten einer BoundingBox gegen den Uhrzeigersinn angegeben werden müssen. Damit können wir an Hand der Normale der Begrenzungskante bestimmen, ob ein Punkt außerhalb der BoundingBox oder innerhalb liegt. Wenn die Punkte richtig angegeben sind zeigt die Normale nach außen wie in der Skizze zu sehen ist.
Achtung Fehlerquelle !!!
In der Computergrafik ist das Koordinatensystem normalerweise kopfüber gezeichnet, so dass die linke obere Ecke des Zeichenbereichs den Koordinatenursprung bildet und die Achsen nach rechts und nach unten verlaufen. Auf Grund dessen ändert sich hier die Reihenfolge in der die Kanten angegeben werden müssen. Bei seltsamen Ergebnissen, sollte man überprüfen, ob man hierauf geachtet hat.
Nun zum Rechenweg
Der korrigierten Zielpunkt kann berechnet werden indem vom unkorrigierten Zielpunkt
der auf Länge
skalierte Bewegungsvektor
abgezogen wird:
Offensichtlich wird also der Wert von benötigt. Anhand der Skizze ist zu erkennen, das
die Hypotenuse des durch
,
und
aufgespannten rechtwinkligen Rechteckes ist. Es gilt also folgende Beziehung:
Der Sinus von kann über den Kosinus von
berechnet werden, welcher über das Skalarprodukt zweier Vektoren, die die Richtung der beiden Geraden
und
darstellen, berechnet wird:
Weiterhin muss noch der Abstand des unkorrigierten Zielpunktes
zur Geraden
berechnet werden.
Eigentlich ist das nicht wirklich der Abstand, da nicht der Betrag, sondern ein vorzeichenbehafteter Wert übernommen wird. Hier ist die Orientierung der Normale der Geraden wichtig. Sollte
außerhalb des von der Begrenzungskante begrenzten Bereiches liegen, ist dieser Wert positiv, sollte er innerhalb liegen, ist er negativ. Sollte dies der Fall sein ergibt sich folgende Situation:
Da negativ ist, gilt weiterhin folgende Beziehung:
Die Normale einer Gerade in der Ebene (also in 2D) wird einfach durch den Richtungsvektor der Gerade berechnet:
Damit lassen sich alle benötigten Werte auf bekannte Werte zurückführen und die korrigierte Zielposition kann ausgerechnet werden.
Da die Begrenzungskante nicht alleine ist, sondern zusammen mit anderen Kanten einen Bereich abgrenzt, wollen wir nur die Kollision von einer Seite der Kante aus betrachten. Es könnte sonst zu ungewollten Ergebnissen kommen wie hier dargestellt:
Wenn die rote Linie zuletzt verarbeitet würde, würde die „korrigierte“ Zielposition immer noch falsch sein. Wirklich korrekte Positionen werden wie hier durch den grünen Kreis
nur durch Kollisionen mit Linien aus der richtigen Richtung (in den abgrenzenden Bereich hinein) erzeugt.
Es muss also überprüft werden, ob die Bewegung auf die Kante zu geht oder von ihr weg. Dazu folgende Skizze:
Die blaue Gerade führt in den abgegrenzten Bereich hinein und die rote Gerade von ihm weg.
Um herauszufinden welcher Fall für die aktuelle Gerade eingetreten ist, berechnen wir den vorzeichenbehafteten Abstand
und überprüfen das Vorzeichen. Nur Geraden mit negativen Werten müssen beachtet werden.
Demo und Quellcode
Wer das alles einfach mal ausprobieren will, oder ein wenig Quellcode dazu sehen will, dem empfehle ich mein Demoprogramm hierzu anzuschauen :
Demonstrationsprogramm zu diesem Teil
Allerdings ist es damit noch nicht getan, denn es gibt Situationen wo dieser einfache Ansatz nicht ausreicht. Momentan behandeln wir die Begrenzungskante nämlich als Gerade und nicht als begrenzte Strecke mit Start- und Endpunkt. Das Demoprogramm verdeutlicht dies noch einmal.
[…] Bewegung mit Kollisionserkennung Teil 2 […]
[…] Bewegung mit Kollisionserkennung Teil 2 […]