8 Stimmen

Wie finde ich die Vektoren der anderen beiden Achsen, wenn ich den Vektor einer Achse habe?

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.

19voto

Justin L. Punkte 13196

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] .

3voto

Es reicht nicht aus, nur eine Achse zu haben, denn es gibt immer noch eine unendliche Anzahl von Achsen, die in der senkrechten Ebene liegen können.

Wenn es Ihnen gelingt, eine weitere Achse zu erhalten, können Sie das Kreuzprodukt verwenden, um die dritte Achse zu finden.

1voto

Ozan Punkte 4255

Wenn man einen Vektor (x,y,z) hat, erhält man einen senkrechten Vektor dazu als (y,-x,0) (das Punktprodukt ist x y-y x+0*z = 0)

Dann nimmt man das Kreuzprodukt aus beiden, um den verbleibenden senkrechten Vektor zu erhalten: (x,y,z) × (y,-x,0) = (0y+zx, yz-0x, -x²-y²) = (zx, yz, -x²-y²)

0voto

Jack Punkte 128223

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X