2017-03-02 4 views
1

Wie kann ich die x, y und z Rotationswerte zwischen zwei Einheitsvektoren erhalten? Ich kann das Skalarprodukt nicht verwenden, weil mir das nur einen Wert gibt. Ich möchte Rotationsmatrizen verwenden, um auf jeder Achse zu rotieren, und für diese brauche ich die Winkelunterschiede auf jeder Achse. Ich habe das Skalarprodukt von nur zwei Komponenten versucht, aber ich habe ein wenig verwirrt. Gibt es eine schnelle und einfache Möglichkeit, dies zu tun? Vielleicht habe ich es falsch gemacht mit dem Zwei-Komponenten-Ding, aber ich weiß es nicht. Am besten wäre, wenn jemand eine Glsl-Methode kennt, um genau diese Sache zu tun!Hole xyz Winkel zwischen Vektoren?

Antwort

2

Wenn Sie die x-, y- und z-Winkel zwischen zwei Vektoren erhalten möchten, nehmen Sie das Skalarprodukt der Projektionen der beiden Vektoren auf die orthogonale Ebene der gewünschten Achse.

Das heißt, wenn Sie den Z-Winkel zwischen den beiden Vektoren möchten, erstellen Sie xy-Ebene Vektoren der Originale. Erstellen Sie dazu einen Vektor, der die z-Komponente der Vektoren ignoriert.

vec3 u = vec3(...); // your input vector 
vec3 v = vec3(...); // your other input vector 
float x_angle = acos(dot(u.yz, v.yz)); 
float y_angle = acos(dot(u.xz, v.xz)); 
float z_angle = acos(dot(u.xy, v.xy)); 

Beachten Sie, dass es nicht, wenn Sie u.xz oder u.zx verwenden keine Rolle, da Sie das Punktprodukt verwenden würde. Stellen Sie sicher, dass Sie die gleiche Reihenfolge für beide Vektoren innerhalb des Skalarprodukts verwenden. Außerdem nehmen die Zeilen 3 bis 5 des Codes hier Einheitsvektoren an, da Vektorlängen im Ausdruck nicht erwähnt werden.

Es sollte auch beachtet werden, dass die Verwendung von acos zu Fehlern für kleine Werte des Arguments führen kann. Um dies zu vermeiden, kann der Unterschied zwischen den 2D-Projektionsvektoren verwendet und mit der atan2-Funktion verwendet werden.

bearbeiten

Auf Vorschlag, dass das ultimative Ziel, eine Rotationsmatrix zu konstruieren ist, andere Vektoren mit der gleichen Transformation neu zu orientieren, schlage ich vor, den Achse-Winkel-Ansatz (sonst als beliebige Achse Rotationen bekannt). Das Verfahren beinhaltet das Finden des Winkels zwischen den zwei Vektoren (Skalarprodukt) und einer geeigneten Rotationsachse, um die dieser Winkel gerichtet ist (Kreuzprodukt).

In einem ersten Schritt möchten Sie den Winkel zwischen den beiden Vektoren mithilfe des Skalarprodukts ermitteln.

float angle = acos(dot(u, v)); // for unit vectors 

Als nächstes, um die Drehachse zu finden, verwenden Sie das Kreuzprodukt. Wissend, dass das Kreuzprodukt einen Vektor ergibt, der senkrecht sowohl zu u als auch zu v ist, ergibt das Überkreuzen in jeder Reihenfolge eine geeignete Achse.

vec3 axis = cross(u, v); // again, for unit vectors 
// normalize this if need be 

Die Form der Matrix wollen Sie unter der Überschrift Rotation Matrix aus Achse und Winkel finden auf dieser Wikipedia article nutzen können. Ich empfehle, einige temporäre Werte zu speichern, um die Berechnung schneller auszuführen.

float c = cos(angle); 
float s = sin(angle); 
float t = 1 - c; 

Sobald Sie diese Matrix aufgebaut haben, multiplizieren Sie einfach durch einen beliebigen Vektor der ursprünglichen Transformation erneut anwenden.

+0

das hat nicht ganz funktioniert: ich tat dies mit u und v ist der gleiche Vektor, und ich habe den Vektor grundsätzlich zurück (out = (0, 0, 1), in = (0, 0, 1)) . es funktioniert auch nicht mit anderen vectros –

+0

Was ist Ihr Gesamtprozess, um einen neuen Vektor zu bekommen? Ich bin gespannt, was dein ultimatives Ziel ist. Wie bereits erwähnt, kann es bei Vektoren, die die gleichen sind, etwas seltsam sein, wenn Sie die Acos verwenden.In Lua zum Beispiel musste ich die Eingabe klemmen, um nicht NaN zu bekommen. – Nathan

+0

Okay. Und mein Ziel ist es, den Unterschied der Drehung auf der Baumachse zu erhalten, also kann ich diese Werte in Rotationsmatrizen einfügen und diese zum Drehen eines anderen Vektors verwenden. Dann werden die gedrehten Vektoren y-axia mit meinem anderen Vektor ausgerichtet. –

Verwandte Themen