Algorithums Bewegung und Zielerkennung im 3D-Raum
-
Hallo zusammen.
Zum Problem:
Ich bewege mich im 3D-Raum von einem Punkt A zum Punkt B für einen Richtungs-Vektor, der vorher berechnet wird, und die Bewegung der Kamera pro Tick, oder pro Durchlauf, angibt.Hierbei habe ich das Problem, zu erkennen, wann ich am Ziel angekommen bin.
Ich habe mir somit ersteinmal den einfachsten möglichen Fall angesehen, im eindimensionalen Raum.
D.h. ich habe bspw. einen Punkt A an der Position 0 und einen Punkt B an der Position 2, meine Bewegung pro Tick entspirch 0.3 .
Meine Abfrage wäre hier, wenn ich die aktuelle Position pro Tick um die Bewegung erhöhe, folgende:
if(current.x + 0.3 >= target.x) current.x = target.x;
Klingt einfach ist es eigentlich auch, nach 6 Ticks wäre ich bei 1.8 und könnte somit, die nächste Position auf die Zielposition setzen.
Der nächste Fall im eindimensionalen Raum wäre, wenn ich einen Punkt A an der Position 0 habe, sowie einen Punkt B an der Position -2 und meine Bewegung bleibt bei 0.3 .
if(current.x - 0.3 <= target.x) current.x = target.x;
Okay, nach 6 Ticks wäre ich ebenfalls an der oben genannten Position im negativen Bereich.
Das Problem ist jetzt, den Algorithmus ersteinmal fehlerfrei zu bekommen, d.h. ich kann beide Abfragen nicht nacheinander tätigen, da so eine immer wahr wäre um das zu beheben würde ich den Algorithmus modifizieren:
// tick = 0.3 if(current.x + tick >= target.x && current.x < target.x) current.x = target.x; if(current.x - tick <= target.x && current.x > target.x) current.x = target.x;
Dann hätte ich das Problem gelöst und könnte in Ruhe weitermachen, so, was ich auch mache, aber ich denke ihr seht wo das schon hinführt, der Quellcode wird dann einfach nur bombastisch fett, wenn ich dass auf drei Dimensionen hochrechne, da jede Dimension den gleichen Quellcode benötigt...
Kennt jemand evtl. Alternativen und Abhilfe ?
Evtl. schon einen existierenden Algorithmus der wenigstens etwas kompakter und überschaulicher ist ?Ich meine zwei Dimensionen würden evtl. noch gerade so gehen, obwohl ich dann schon Redundanzen dabei hätte, aber bei drei Dimensionen schreibt man sich denke ich einen Wolf.
Liebe Grüße und Danke,
SkiD.
-
Man erstellt eine eigene Klasse Umgebung mit den Parametern Position und Radius und bietet eine Methode contains an, die prueft, ob eine gegebener Punkt sich innerhalb dieser Umgebung befindet. Also fragt, ob der Abstand (oder Abstandsquadrat) kleiner ist als der Radius (Radius zum Quadrat).
Es muss auch nicht unbedingt eine Klasse sein: bool contains(position,radius,point) reich auch aus.
Allgemeine Strategie: Code, der sich wiederholt, in Funktionen auslagern!
-
Vorrausgesetzt du bewegst dich auf eienr geraden linie zu deinem Ziel könnte dir die Vectorlänge weiterhelfen, das zieht aber ein bischen Rechnerei nach sich. Wenn du beide Positionen hast machst du einen Bewegungsvektor und normalisierst ihn und Multiplizierst ihn mit der Geschwindigkeit, ihn kannst du aufaddieren. Du müsstest dann nur den Vector als ganzes, oder einen beliebigen Wert aus dem Vector prüfen da sich alle 3 Werte dann Synchron steigern. Den Normalisierten vector soltest du dann aber nach Möglichkeit nur einmal Berechnen (Wurzel).
Das wäre was mir dazu vorschweben würde.