Winkel zwischen zwei 3D-Vektoren



  • Hi,

    ich habe zwei Positionsvektoren V1 und V2 im 3D-Raum. V2 hat die Distanz d zu V1.

    Zudem gibt es einen V3 = (V1.x + d, V1.y, V1.z)

    Nun möchte ich zwei Winkel zwischen V1 und V2 erhalten, sodass ich V3 zu V2 befördern kann.

    Gegeben ist dabei eine Rotationsmethode von V3 rotate(origin, float arcX, float arcY, float arcZ), sodass ich sagen kann:

    V3.rotate(V1, 180°, 0, 0) z.B.

    Meine bisherige Lösung umfasst Folgendes für V2.x > V1.x:

    yRotation = atan( (v2.z - v1.z) / (v2.x - v1.x));
    zRotation = atan( (v2.y - v1.y) / (v2.y - v1.y));

    bzw. für V2.x < V1.x:

    yRotation = 180° - atan( (v2.z - v1.z) / (v2.x - v1.x));
    zRotation = 180° - atan( (v2.y - v1.y) / (v2.y - v1.y));

    Das funktioniert auch für so gut wie alle Winkel ganz gut. Jetzt habe ich aber ständig Probleme, wenn es zu rechten Winkel in irgendeiner Form kommt. Wenn z.B. der zweite Fall (V2.x < V1.x) eintritt und dabei v2.z == v1.z, dann ist yRotation und zRotation jeweils 0 und damit dreht er sich zwei Mal um 180° und somit ist die Rotation wieder genau ausgeglichen. 🙄

    Bevor ich jetzt alle möglichen Sonderfälle auf Papier durchrechne: geht es auch einfacher?



  • Die frage ist; brauchst du die Winkel?

    Ansonsten ist v_3=u+v_2\vec{v}\_3 = \vec{u}+ \vec{v}\_2 mit v_3=v_1+(d,0,0)T\vec{v}\_3 = \vec{v}\_1 + (d,0,0)^T und somit u=v_1v_2+(d,0,0)T\vec{u} = \vec{v}\_1-\vec{v}\_2+(d,0,0)^T



  • Ich vermute mal es geht dir einfach darum, ein Objekt entlang einer durch einen Vektor gegebenen Richtung auszurichten? Wenn ja brauchst du den Winkel nicht, bastel dir einfach eine Matrix direkt aus deinen Vektoren.



  • Hi,

    das Problem ist, dass ich gerade mit einer Engine arbeite, in der ich die automatische Boxerstellungsfunktion ausnutzen möchte. Die Box (also ein Quader) wird erstellt, jedoch ist die Ausrichtung fix mit (d,0,0). Es reicht also nicht den Punkt zu projezieren, sondern ich muss, genau wie dot sagt, das Objekt ausrichten.

    rotate() akzeptiert jedoch auch eine Matrix oder Quaternion.

    ScottZhang:
    Leider funktioniert diese Lösung daher nicht. Dennoch danke!

    dot:
    Eine interessante Idee. Leider lassen mich da wieder meine Kenntnisse hängen. Zwar weiß ich generell wie Vektor/Matrix-Multiplikation funktioniert und auch wie Rotationsmatrizen aussehen, jedoch kann ich daraus selbst nichts Sinnvolles basteln. Hast Du die Lösung oder alternativ auch ein Stichwort für tiefergehende Lektüre?



  • Quaternion iss doch perfekt. Achse haste (Kreuzprodukt) und Winkel (bzw cos und sin) haste auch (Kreuz- und Skalarprod).



  • Eisflamme schrieb:

    dot:
    Eine interessante Idee. Leider lassen mich da wieder meine Kenntnisse hängen. Zwar weiß ich generell wie Vektor/Matrix-Multiplikation funktioniert und auch wie Rotationsmatrizen aussehen, jedoch kann ich daraus selbst nichts Sinnvolles basteln. Hast Du die Lösung oder alternativ auch ein Stichwort für tiefergehende Lektüre?

    Schau dir mal an wie eine Kameramatrix in der Regel gebaut wird. Im Prinzip steckt da genau das drin was du hier tun willst: Ausrichten entlang geggebener Achsen (werden aus position, lookat und up bestimmt).

    Ganz allgemein entsprechen die Zeilen (oder Spalten, je nachdem welcher Konvention du folgst) einer Matrix einfach nur den Basisvektoren des durch die Matrix repräsentierten Koordinatensystems. Wenn du dir nun mal die Formel für eine Rotationsmatrix genau anschaust, wird dir auffallen, dass die auch einfach nur genau das macht, nämlich eben die Richtungen der Koordinatenachsen entsprechend der Rotation um den gegebenen Winkel um die gegebene Achse auszurechnen.
    In deinem Fall kannst du dir deine Basisvektoren aber einfach direkt über ein paar Kreuzprodukte ausrechnen, in die Spalten einer Matrix packen und fertig.

    Meiner Erfahrung nach ist man praktisch immer gerade dabei was falsch zu machen, wenn man versucht von Vektoren auf irgendwelche Winkel zurückzurechnen, nur um dann aus diesen Winkeln wieder neue Vektoren zu machen 😉


Anmelden zum Antworten