Dies ist ein mathematisches Problem, bei dem ich mir nicht ganz sicher bin, wie es zu lösen ist. Der Vektor ist nicht an einer Achse ausgerichtet, so dass eine einfache Drehung um 90 Grad um x, y oder z nicht unbedingt die anderen Achsen ergibt.
Antworten
Zu viele Anzeigen?Ich kann mir mehrere Szenarien vorstellen, nach denen Sie fragen könnten.
Gegeben: Ein bereits vorhandenes Koordinatensystem
-
In einem 2D-System sind Ihre Achsen/Basis immer
[1,0]
y[0,1]
-- x y y Achsen. -
In einem 3D-System sind Ihre Achsen/Basis immer
[1,0,0]
,[0,1,0]
und[0,0,1]
-- x , y und z .
Gegeben: Eine Achse in einem 2D-Koordinatensystem auf beliebiger Basis
Wenn Sie eine Achse in einem 2D-Koordinatensystem auf beliebiger Basis haben, ist die andere Achse der orthogonale Vektor.
So drehen Sie einen Vektor orthogonal gegen den Uhrzeigersinn :
[x_new, y_new] = [ -y_old, x_old]
So drehen Sie einen Vektor orthogonal im Uhrzeigersinn :
[x_new, y_new] = [ y_old, -x_old]
Zusammengefasst:
Given: x-axis = [ a, b]
Then: y-axis = [-b, a]
Given: y-axis = [ c, d]
Then: x-axis = [ d, -c]
Gegeben: Zwei Achsen in einem 3D-Koordinatensystem auf beliebiger Basis
Zu diesem Zweck wird das Kreuzprodukt ermittelt.
[a,b,c] x [d,e,f] = [ b*f - c*e, c*d - a*f, a*e - b*d ]
Befolgen Sie diese drei Leitlinien:
- ( x Achse) x ( y Achse) = ( z Achse)
- ( y Achse) x ( z Achse) = ( x Achse)
- ( z Achse) x ( x Achse) = ( y Achse)
Gegeben: Eine Achse in einem 3D-Koordinatensystem auf beliebiger Basis
Es gibt nicht genügend Informationen, um die die einzigartige Lösung dieses Problems. Betrachtet man nämlich den zweiten Fall (eine Achse in einem 2D-Koordinatensystem auf beliebiger Basis), so muss man zunächst einen orthogonalen Vektor finden. Es gibt jedoch eine unendliche Anzahl möglicher orthogonaler Vektoren zu einer einzigen Achse im 3D-Raum!
Sie können jedoch eine der möglichen Lösungen finden.
Eine Möglichkeit, einen beliebigen dieser orthogonalen Vektoren zu finden, ist die Suche nach einem beliebigen Vektor [d,e,f]
wo:
[a,b,c] = original axis
[d,e,f] = arbitrary orthogonal axis (cannot be [0,0,0])
a*d + b*e + c*f = 0
Wenn Ihre ursprüngliche Achse zum Beispiel lautet [2,3,4]
würden Sie lösen:
2 * d + 3 * e + 4 * f = 0
Das heißt, tout Wert von [d,e,f]
der diese Bedingung erfüllt, ist ein zufriedenstellender orthogonaler Vektor (solange es sich nicht um [0,0,0]
). Man könnte zum Beispiel wählen, [3,-2,0]
:
2 * 3 + 3 *-2 + 4 * 0 = 0
6 + -6 + 0 = 0
Wie Sie sehen können, ist eine "Formel", die funktioniert, folgende [d,e,f] = [b,-a,0]
...aber es gibt noch viele andere, die ebenfalls funktionieren können; es gibt sogar unendlich viele!
Sobald Sie Ihre beiden Achsen gefunden haben [a,b,c]
y [d,e,f]
können Sie dies auf den vorherigen Fall (Fall 3) zurückführen, indem Sie [a,b,c]
y [d,e,f]
als x- und y-Achse (bzw. als die Achsen, die Sie für Ihr spezielles Problem benötigen).
Normalisierung
Beachten Sie, dass Ihre Vektoren immer größer werden, je mehr Sie Punkt- und Kreuzprodukte bilden. Je nachdem, was Sie wollen, ist dies möglicherweise nicht erwünscht. Zum Beispiel könnten Sie wollen, dass Ihre Basisvektoren (Ihre Koordinatenachsen) alle die gleiche Größe/Länge haben.
Zum Drehen eines beliebigen Vektors (außer [0,0,0]
) in eine Einheitsvektor (ein Vektor mit der Länge 1, in der gleichen Richtung wie der ursprüngliche Vektor):
r = [a,b,c]
v = Sqrt(a^2 + b^2 + c^2) <-- this is the length of the original vector
r' = [ a/v , b/v , c/v ]
Wo r'
stellt den Einheitsvektor von r
-- ein Vektor mit der Länge 1, der in dieselbe Richtung zeigt wie r
tut. Ein Beispiel:
r = [1,2,3]
v = Sqrt(1^2 + 2^2 + 3^2) = Sqrt(13) = 3.60555 <-- this is the length of the original vector
r' = [0.27735, 0.55470, 0.83205]
Wenn ich nun zum Beispiel einen Vektor in der gleichen Richtung von r
mit einer Länge von 5, würde ich einfach ausmultiplizieren r' * 5
das ist [a' * 5, b' * 5, c' * 5]
.
Sprechen Sie von einem typischen 3-Koordinatensystem, wie es in einer 3D-Engine verwendet wird?
Mit nur einem Vektor kann man die anderen beiden nicht finden, die einzige Information, die man hat, ist die Ebene, auf der sie liegen aber sie können auch in einem beliebigen Winkel liegen, wenn sie senkrecht zu dem einzigen Vektor stehen, den man hat.