Ich arbeite an einer Bewegungs-KI, bei der es keine Hindernisse gibt und die Bewegung auf die XY-Ebene beschränkt ist. Ich berechne zwei Vektoren, v , die Blickrichtung von Schiff 1 und w , wobei der Vektor von der Position von Schiff 1 zu Schiff 2 zeigt.
Ich berechne dann den Winkel zwischen diesen beiden Vektoren mit der Formel
arccos((v · w) / (|v| · |w|))
Das Problem, das ich habe, ist, dass arccos
nur Werte zwischen 0 ° und 180 ° zurückgibt. Dies macht es unmöglich zu bestimmen, ob ich nach links oder rechts abbiegen soll, um mich dem anderen Schiff zuzuwenden.
Gibt es einen besseren Weg, dies zu tun?
Mathf.DeltaAngle()
.Antworten:
Es ist viel schneller, ein 2D-Cross-Produkt zu verwenden. Keine kostspielige Auslösefunktion.
Wenn Sie noch die tatsächlichen Winkel benötigen, empfehle ich mit
atan2
.atan2
Gibt den absoluten Winkel eines Vektors an. Um den relativen Winkel zwischen beliebigen Vektoren zu erhalten, berechnen Sie deren absoluten Winkel und verwenden Sie eine einfache Subtraktion.quelle
arccos
. Auf diese Weise verwenden Sie nur eine Triggerfunktion, haben aber immer noch den tatsächlichen Winkel. Ich empfehle jedoch, gegen diese Optimierung vorzugehen, bis Sie sicher sind, dass das Verfolgen des KI-Winkels einen spürbaren Einfluss auf die Leistung Ihres Spiels hat.if( cross == -0.0f )
Vs-if( cross == 0.0f )
Scheck sieht extrem zerbrechlich aus.Verwenden Sie ArcSin des 2D-Kreuzprodukts (dh die z-Komponente des Kreuzproduktvektors). Das gibt dir -90 bis 90, wodurch du weißt, ob du nach links oder rechts gehen sollst.
Seien Sie vorsichtig, da A-Kreuz B nicht mit B-Kreuz A identisch ist.
Eine andere Strategie (aber wahrscheinlich nicht so einfach) besteht darin, die "Überschrift" der beiden Vektoren mit atan2 zu berechnen und dann herauszufinden, ob A, das auf X Grad zeigt, nach links oder rechts gehen muss, um zu B zu gelangen, das auf y Grad zeigt.
quelle
Verwenden Sie Vektoren , um das Schiff umzuleiten. So funktioniert "Lenkverhalten" - Sie müssen den Winkel nie berechnen, sondern nur die Vektoren verwenden, die Sie haben. Dies ist rechnerisch wesentlich günstiger.
Der Vektor
w
(Vektor von Schiff 1 nach Schiff 2) enthält alle Informationen, die Sie benötigen. Ändern Sie entweder den Geschwindigkeitsvektor von Schiff 1 oder den Beschleunigungsvektor von Schiff 1 (oder sogar den Kursvektor direkt) mit einer gewichteten Version vonw
.Die Größe, wie weit Schiff 1 vom Kurs abweicht (wie schlecht v nicht mit w übereinstimmt), kann mit (
1 - dot(v,w)
) ermittelt werden.dot(v,w)
Wird maximiert, wennv
undw
genau ausgerichtet)1 - dot(v,w)
) gibt 0, wennv
undw
vollständig aufgereiht, bereitgestelltv
undw
normalisiert sind)quelle
Es gibt eine einfache Möglichkeit, den absoluten Winkel eines Vektors durch normale Geometrie zu ermitteln.
zum Beispiel Vektor V = 2i - 3j;
absoluter Wert von x Koeffizient = 2;
absoluter Wert des y-Koeffizienten = 3;
Winkel = atan (2/3); [Winkel liegt zwischen 0 und 90]
Basierend auf Quadrantenwinkel wird geändert.
wenn (x-Koeffizient <0 und y-Koeffizient> 0) dann Winkel = 180-Winkel;
wenn (x-Koeffizient <0 und y-Koeffizient <0) dann Winkel = 180 + Winkel;
wenn (x-Koeffizient> 0 und y-Koeffizient <0) dann Winkel = 360-Winkel;
wenn (x-Koeffizient> 0 und y-Koeffizient> 0), dann ist Winkel = Winkel;
Nach dem Finden des Winkels des ersten und des zweiten Vektors subtrahieren Sie einfach den ersten Vektorwinkel vom zweiten Vektor. Dann erhalten Sie den absoluten Winkel zwischen zwei Vektoren.
quelle
Vielleicht sollte ich eine etwas andere Frage stellen und sie selbst beantworten. Das ist die Frage, die ich am ehesten finden konnte.
Ich mache 2D-Arbeit im HTML-Canvas, wo ich Rotationswinkel im Bogenmaß anstelle von Vektoren habe. Ich brauchte den "Drehwinkel" (ta), um vom "aktuellen Kurs" (h) zum "Zielkurs" (t) zu gelangen.
Hier ist meine Lösung:
quelle