2016-07-08 11 views
0

Ich möchte eine Funktion erstellen, die einen Winkel, zwei Vektoren, empfängt. Einer davon ist ein Einheitsvektor, der die Richtung der Rotationsachse definiert der andere ist der zu drehende Vektor und ein Punkt P, der die Verankerungsposition der Rotation definiert.Eigen: Führe eine 3D Drehung um eine Achse W durch und verankere an einem Punkt P

Um dies in Eigen zu implementieren Ich denke, ich müsste das Geometrie-Modul verwenden, leider, ich denke, die Dokumentation dieses Moduls ist nicht großartig und ich verstehe es nicht.

Meine Idee ist, die Rotation Transformation AngleAxis<float> mit zwei Übersetzungen zu kombinieren, aber ich verstehe nicht, wie mache ich das. Ich schaffte es nur die Rotationsmatrix wie folgt zu definieren:

VectorXf m1(3); 

Matrix3f m; 
m1(0)=2; 
m1(1)=1; 
m1(2)=2; 

m = AngleAxisf(M_PI, m1); 

Aber ich konnte nie eine Übersetzungsmatrix erstellen oder die Verkettung von Ausdrücken sie in der Dokumentation des Moduls erwähnen verwenden.

Ich würde jede mögliche Hilfe/Vorschläge schätzen, die Sie geben konnten.

Mein Dank im Voraus.

Antwort

1

Um eine Rotation plus Translation darzustellen, benötigen Sie eine 3x4- oder 4x4-Matrix. Mit Eigen können Sie direkt Rotationen und Übersetzungen verketten wie folgt:

Vector3f w = ...; // rotation axis 
Vector3f c = ...; // center of rotation 
Affine3f A = Translation3f(c) * AngleAxisf(theta, w) * Translation3f(-c); 

Affine3f ein Eigen::Transform ist. Es kapselt einen Matrix4f, den Sie mit A.matrix() erhalten können. Sie können das Objekt Affine3f auch direkt zum Transformieren von Punkten verwenden. Details finden Sie unter manual.

+0

OK Ich folgte Ihrer Empfehlung und es funktioniert jetzt, aber ich musste 'conservativeResize' verwenden, damit dies funktioniert, ich. e .: 'point.conservativeResize (4); Punkt (3) = 1; Affine3d A = Translation3d (Anker) * AngleAxisd (M_PI, Achse) * Translation3d (-Anchor); Punkt = (A.matrix() * Punkt); point.conservativeResize (3); '. Ich habe mich gefragt, ob es einen direkteren Weg dafür gibt. Danke für Ihre Hilfe. – jcarvalho

+0

Sie tun besser: 'p1 = A * p0'. – ggael