Ich kann mir ein paar verschiedene Szenarien vorstellen, nach denen Sie fragen könnten.
Gegeben: Ein bereits vorhandenes Koordinatensystem
In einem 2D-System sind Ihre Achsen / Basis immer [1,0]
und [0,1]
- x und 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 beliebigen 2D-Koordinatensystem
Wenn Sie eine Achse in einem beliebigen 2D-Koordinatensystem haben, ist die andere Achse der orthogonale Vektor.
Um einen Vektor orthogonal zu drehen gegen den Uhrzeigersinn :
%Vor%Um einen Vektor orthogonal zu drehen im Uhrzeigersinn :
%Vor%Zusammenfassend:
%Vor%Gegeben: Zwei Achsen in einem beliebigen 3D-Koordinatensystem
Suchen Sie dazu das Cross-Produkt.
%Vor%Nach diesen drei Richtlinien:
Gegeben: Eine Achse in einem beliebigen 3D-Koordinatensystem
Es gibt nicht genügend Informationen, um die eindeutige Lösung dieses Problems zu finden. Wenn Sie sich den zweiten Fall ansehen (Eine Achse in einem beliebigen 2D-Koordinatensystem), müssen Sie zuerst einen orthogonalen Vektor finden. Es gibt jedoch unendlich viele mögliche orthogonale Vektoren zu einer einzelnen 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, indem ein beliebiger Vektor gefunden wird [d,e,f]
wobei:
Wenn Ihre ursprüngliche Achse beispielsweise [2,3,4]
ist, lösen Sie Folgendes:
Das heißt, jeder Wert von [d,e,f]
, der dies erfüllt, ist ein befriedigender orthogonaler Vektor (solange es nicht [0,0,0]
ist). Man könnte zum Beispiel [3,-2,0]
:
Wie Sie sehen, ist eine "Formel", die funktioniert, [d,e,f] = [b,-a,0]
... aber es gibt viele andere, die auch funktionieren können; Es gibt tatsächlich ein Unendliches!
Sobald Sie Ihre beiden Achsen [a,b,c]
und [d,e,f]
gefunden haben, können Sie diese auf den vorherigen Fall (Fall 3) reduzieren, indem Sie [a,b,c]
und [d,e,f]
als Ihre x- und y-Achsen (oder welche Achsen Sie verwenden) verwenden brauche sie für dein spezifisches Problem).
Normalisierung
Beachten Sie, dass Ihre Vektoren immer größer und größer werden, wenn Sie fortlaufend Punktprodukte und Produkte kreuzen. Je nachdem, was Sie wollen, ist dies möglicherweise nicht erwünscht. Zum Beispiel möchten Sie vielleicht, dass Ihre Basisvektoren (Ihre Koordinatenachsen) alle die gleiche Größe / Länge haben.
Um jeden Vektor (außer für [0,0,0]
) in einen Einheitsvektor zu verwandeln (ein Vektor mit einer Länge von 1, in der gleichen Richtung wie der ursprüngliche Vektor):
Dabei steht r'
für den Einheitsvektor von r
- ein Vektor mit der Länge 1, der in die gleiche Richtung zeigt wie r
. Ein Beispiel:
Wenn ich nun zum Beispiel einen Vektor in der gleichen Richtung von r
mit einer Länge von 5 wollte, würde ich einfach r' * 5
multiplizieren, was [a' * 5, b' * 5, c' * 5]
ist.
Es ist nicht genug, nur eine Achse zu haben, da immer noch unendlich viele Achsen in der senkrechten Ebene liegen können.
Wenn Sie es jedoch schaffen, eine andere Achse zu bekommen, können Sie das Kreuzprodukt verwenden, um das dritte zu finden.
Wenn Sie einen Vektor (x, y, z) haben, können Sie einen senkrechten Vektor als (y, -x, 0) erhalten (Punktprodukt ist x yy x + 0 * z = 0)
Dann nehmen Sie das Kreuzprodukt von beiden, um den verbleibenden senkrechten Vektor zu erhalten: (x, y, z) × (y, -x, 0) = (0y + zx, yz-0x, -x²-y²) = (zx, yz, -x²-y²)
Sprechen Sie von einem typischen 3-Koordinaten-System, wie es in einer 3D-Engine verwendet wird?
Mit nur einem Vektor können Sie die anderen zwei nicht finden, die einzige Information, dass Sie die Ebene haben werden, auf der sie liegen. Aber sie können in jedem Winkel sein, auch wenn sie senkrecht zu dem einzigen Vektor Sie sind haben.