Rotationsmatrix aus Start- und Zielorientierung

Hallo,

ich bin am verzweifeln… und ich hoffe hier kann mir jemand helfen.

Ich möchte einen Zylinder, den ich in Länge, Lage und Orientierung anpassen kann zwischen zwei Punkten platzieren, sodass der Zylinder auch bei Bewegung der Punkte immer dazwischen bleibt. Der Zylinder ist übrigens ein Java3D Objekt (dieses Objekt wird bei der Erzeugung entlang der x-Achse gelegt). Leider kann ich den Zylinder nicht so positionieren wie eine Linie, mit Anfangs- und Endpunkt, sondern muss über transformationen eine geeignete Orientierung und Lage finden. Die Länge berechnet sich aus dem Abstand der beiden Punkte (trivial).

Länge = |P2-P1|

Die Lage ergibt sich aus dem halben Abstand der Punkte, also:

Lage = P1 + halberVektorVon(P2 - P1)

So, nun zur Orientierung, an der ich verzweifle:
Gegeben: P1, P2, Lage, Länge
Gesucht: Rotationsmatrix, um den Java3D Zylinder korrekt in der Orientierung im 3 Dim. Raum darzustellen

Lösungsideen:

  1. Berechnung des normalisierten Richtungsvektors NR=P2-P1

Un nun häng ich auch schon. Ich weiß nicht wie ich von dem NR auf die gesamte Rotationsmatrix komme.

  1. Ich könnte aus der ursprünglichen Lage&Orientierung der Längsachse des Zylinders (also entlang der x-Achse, da Java3D den Zylinder dort erzeugt) und der neuen Lage&Orientierung der Längsachse (anhand der Punkte P1 und P2) die Rotationsmatrix berechnen. Aber ich weiß nicht wie…

Vielen Dank für Eure Hilfe!

Christian

Hallo,

  1. Ich könnte aus der ursprünglichen Lage&Orientierung der
    Längsachse des Zylinders (also entlang der x-Achse, da Java3D
    den Zylinder dort erzeugt) und der neuen Lage&Orientierung der
    Längsachse (anhand der Punkte P1 und P2) die Rotationsmatrix
    berechnen. Aber ich weiß nicht wie…

um den Zylinder aus seiner Grundorientierung e x in die gewünschte Orientierung e Zylinder = Einheitsvektor in Richtung p 2p 1 zu bringen, musst Du ihn um die Achse drehen, in die der Vektor e x × e Zylinder zeigt. Das ist kein Einheits- sondern ein sin(φ) langer Vektor, mit φ = von e x und e Zylinder eingeschlossener Winkel = passender Zylinder-Drehwinkel.

Für den hiesigen Fall ergibt sich (sei e Zylinder = (r, s, t)):

e x × e Zylinder = (1, 0, 0) × (r, s, t) = (0, –t, s)

sin(φ) = | e x × e Zylinder| = √(s² + t²)

Jetzt musst Du nur noch die Rotationsmatrix für eine Drehung um eine beliebige, durch den Einheitsvektor e = (u, v, w) spezifizierte Achse und einen beliebigen Winkel φ kennen. Sie lautet:

 ( C + (1-C)u² (1-C)uv + Sw (1-C)uw - Sv )
 ( )
 ( (1-C)uv - Sw C + (1-C)v² (1-C)vw + Su )
 ( )
 ( (1-C)uw + Sv (1-C)vw - Su C + (1-C)w² )

mit C := cos(φ), S := sin(φ)

Für Dein Problem ist

e = ( e x × e Zylinder) / sin(φ) = 1/√(s² + t²) (0, –t, s),

also u = 0, v = –t/√(s² + t²) und w = s/√(s² + t²).

Probiers aus, wenn Du Lust hast.

Gruß
Martin

Vielen Dank Martin! Ich habe schon Stunden mit dem Problem verbracht und bin Dir sher dankbar für Deine Lösung. Ich werde es natürlich gleich ausprobieren…!

VG,
Christian