Die Berechnung der tatsächlichen Winkel zwischen zwei Vektoren in Unity3D
Gibt es eine Möglichkeit, ich kann die Berechnung der tatsächlichen Winkel zwischen zwei 3D-Vektoren in der Einheit? Vector3.Winkel gibt den kürzesten Winkel zwischen den beiden Vektoren. Ich möchte wissen, die tatsächlichen Winkel berechnet im Uhrzeigersinn.
- Was meinst du mit dem kürzesten Winkel? Es gibt nur einen Winkel zwischen zwei Vektoren. Der Winkel wird in der Regel berechnet, indem die (konzeptionell), die sich aus dem ersten Vektor in einem Bogen in Richtung des zweiten Vektors.
- Ich will nicht den Winkel berechnet, mit dem Umzug der ersten Vektor im Uhrzeigersinn oder gegen den Uhrzeigersinn in Richtung eines Vektors. Bei der Umsetzung von Vector3.Winkel, bekomme ich 90 Grad, wenn der Vector 2 ist 90 Grad im Uhrzeigersinn vom Vektor 1 oder auch wenn es 270 Grad. Ich will es zurück bis zu 270 Grad.
- Die Antwort, die ich gerade gepostet (und gelöscht), vor zwei Sekunden ist natürlich falsch, aber ich denke, dass Sie definitiv am Ende mit Skalarprodukt der beiden Vektoren.
- Übrigens, was genau meinst du mit "im Uhrzeigersinn"? Von welchem Punkt an, den Sie betrachten möchten diese Vektoren und festzustellen, ob Sie im Uhrzeigersinn oder gegen den Uhrzeigersinn?
- Und was ist, wenn aus der Sicht des besagten Punkt im Raum dieser Vektoren passieren-Projekt in eine Zeile? Zum Beispiel, wenn Sie wollen, um zu bestimmen, "clockwiseness" der Vektoren suchen, die von einem Punkt (0,+9001,0), was über das liegen in der X-Y-Ebene?
- Ja, ich verstehe, was passieren kann mit 3D-Vektoren. Ich benutzte es für Einfachheit in Verständnis, aber ich denke, es interpretiert in die falsche Richtung. Betrachten Sie die Vektoren werden auf die XY-Ebene), dann mit Z = 0. Wenn Vector1 (0, 1, 0) und Vektor 2 (-1, 0, 0), möchte ich das Ergebnis um 270 Grad und nicht 90. Die aktuelle Implementierung von Vector3.Winkel nicht geben Sie einen Winkel > 180 Grad, weil es 360 - Ergebnis, wenn der Winkel > 180 Grad. Ich wollte wissen, ob es eine Möglichkeit gibt, die ich bekommen kann, dass zusätzliche Informationen, wenn der Winkel ist tatsächlich von 270 Grad. Hoffe die Frage ist jetzt klar
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte dies sein, was Sie brauchen.
a
undb
sind die Vektoren, für die Sie möchten, zu berechnen, einen Winkeln
würde die normal von Ihrem Flugzeug, um zu bestimmen, was Sie nennen würde, "im Uhrzeigersinn/gegen den Uhrzeigersinn"Ich der Einfachheit halber die Wiederverwendung
Vector3.Angle
und berechnen Sie dann das Schild von der Größe des Winkels zwischen der Ebene, die senkrechtn
und das Kreuzprodukt (senkrechter Vektor) vona
undb
.float sign = Mathf.Sign(Vector3.Dot(n,Vector3.Cross(a,b)));
a
undb
definieren eine Ebene, aber es gibt eine implizite 3. Vektor, das Kreuzprodukt der ersten 2 definiert wird, sodass das Flugzeug ist normal. Jeden Winkel zwischena
undb
dreht sich um, die 3. Achse. Das problem ist also, welchen Weg wir drehen? Der Winkel zwischen 2 Vektoren ist immer ein positiver Winkel.Vector3.Angle(a,b) == Vector3.Angle(b,a)
. Zu finden ist die Richtung der Drehung benutzen wir die Zeile, die Sie identifiziert, die im wesentlichen nur vergleicht der Benutzer die definierte Drehachsen
gegen die implizite Achse. Wenn ein Spiel, Zeichen ist positiv, wenn nicht, melden Sie negativ ist.Es ist ganz einfach, wenn Sie nur die addition und die Subtraktion. Schau mal hier:
Hier ist, was ich meine:
wenn wir im Uhrzeigersinn und der Winkel ist negativ, z.B. -170
um es 180, verwenden Sie diese Gleichung. "180-|Winkel - |+180"
Sie wissen bereits, dass der Winkel negativ ist, also verwenden Sie "180-(-Winkel)+180" und fügen Sie die 180 "360 + Winkel".
Dann, wenn es im Uhrzeigersinn, WEITER aber wenn es gegen den Uhrzeigersinn, stellen Sie den Winkel negativ ist, ist dies, weil der andere Teil der 360 Winkel (das ist das Kompliment von 360 + Winkel) ist "360 - (360 + Winkel)" oder
"360 - 360 - Winkel" ODER "(360 - 360) - Winkel" und, wieder, ODER "- Winkel". So da sind wir... Ihre fertigen Winkel.
Versuchen
Vector3.Angle(targetDir, forward);
Da Sie den kürzesten Winkel zwischen Ihnen, dann, wenn der zurückgegebene Wert ist um mehr als 180 Grad, einfach subtrahieren Sie 360 Grad mit diesem Wert.
Check-out http://answers.unity3d.com/questions/317648/angle-between-two-vectors.html
Vector3.Angle
sagt: "Der Winkel, der zurückgegeben wird, immer den Spitzen Winkel... nie größer als 180 Grad". Also diese Antwort ist nicht nur die Beantwortung einer Frage, der OP hat nicht danach gefragt, es enthält irreführende oder falsche Informationen zu.