如何用特征找到基变化的变换矩阵

rmb*_*chi 2 c++ geometry eigen

我正在将一个程序移植到 Eigen。

现在我必须重写一个方法,该方法将 3D 变换矩阵从一个坐标系 A(由其原点和两个轴定义)返回到第二个坐标系(仍然由原点和两个轴定义)。

我想知道 Eigen 中是否有一种方法可以找到该矩阵。我浏览了参考指南,但我还没有找到任何有用的方法......


更多详情:

我移植到 Eigen 的方法接受 6 个点(向量)(fr0、fr1、fr2、to0、to1、to2)。“fr0”是CS1(坐标系1)的原点,“fr1”是定义CS1轴​​的点,“fr2”是定义CS1第二轴的点;“to0”是CS2的起源,依此类推……

rmb*_*chi 6

Ok, I found the solution and I post it here for reference. I hope it can be useful to someone else as well.

Actually ggael's answer triggered the right solution, so many thanks to him and +1 for him.


#include <Eigen/Geometry>

typedef Eigen::Affine3d Transformation;
typedef Eigen::Vector3d   Point;
typedef Eigen::Vector3d  Vector;
typedef Eigen::Translation<double,3>  Translation;

Transformation findTransformBetween2CS(Point fr0,Point fr1,Point fr2,Point to0,Point to1,Point to2) {

  Transformation T, T2, T3 = Transformation::Identity();
  Vector3d x1,y1,z1, x2,y2,z2;

  // Axes of the coordinate system "fr"
  x1 = (fr1 - fr0).normalized(); // the versor (unitary vector) of the (fr1-fr0) axis vector
  y1 = (fr2 - fr0).normalized();

  // Axes of the coordinate system "to"
  x2 = (to1 - to0).normalized();
  y2 = (to2 - to0).normalized();

  // transform from CS1 to CS2 
  // Note: if fr0==(0,0,0) --> CS1==CS2 --> T2=Identity
  T2.linear() << x1, y1, x1.cross(y1); 

  // transform from CS1 to CS3
  T3.linear() << x2, y2, x2.cross(y2); 

  // T = transform to CS2 to CS3
  // Note: if CS1==CS2 --> T = T3
  T.linear() = T3.linear() * T2.linear().inverse(); 


  T.translation() = t0;

  return T;

}
Run Code Online (Sandbox Code Playgroud)

Inspiration also came from this post:

https://gamedev.stackexchange.com/questions/26084/transform-between-two-3d-cartesian-coordinate-systems