Eigen库中的Transform类用于表示各种线性变换,如平移、旋转、缩放等,它支持不同的模式来表示不同类型的变换。下面是对这些模式的介绍:
-
Affine(仿射变换):
Affine模式表示一种保持直线平行性质的线性变换,包括平移、旋转、缩放和错切等。在Affine模式下,可以表示任意线性组合的这些变换,即平移、旋转、缩放、错切的组合。这种变换不会改变物体之间的相对位置关系,只会改变其大小、形状和方向。 -
AffineCompact(紧凑仿射变换):
AffineCompact模式与Affine模式类似,但它只表示平移、旋转和缩放,不包括错切变换。这使得该模式下的变换更加紧凑,适用于不涉及错切的情况。 -
Projective(投影变换):
Projective模式表示一种更一般化的变换,包括了仿射变换,并且允许透视投影。透视投影会改变物体的大小、形状、方向以及位置关系。这种变换可以用于模拟3D场景中的相机投影操作,例如将3D坐标映射到2D图像上。 -
Isometry(等距变换):
Isometry模式表示一种保持距离和角度不变的变换,包括平移和旋转。在这种变换下,物体之间的相对距离和角度关系保持不变。这对于保持形状和大小的不变性很有用,例如在计算机图形学中的刚体变换。
总结:
- Affine模式和AffineCompact模式都是用于表示保持直线平行性质的线性变换,区别在于是否包括错切变换。
- Projective模式允许表示更一般化的变换,包括透视投影。
- Isometry模式表示等距变换,保持距离和角度不变。
根据所需的变换类型和特性,您可以选择适合的模式来表示变换操作。
构造函数
Transform类的几种构造函数:
1、默认构造函数
Eigen::Transform<double,3,Eigen::Isometry> tran;
std::cout<<"tran:\n"<<tran.matrix()<<std::endl;
可以看出默认构造函数并不会初始化矩阵元素。
2、传入一个EigenBase类型的对象进行初始化。
Eigen::Transform<double, 3, Eigen::Isometry> tf1(Eigen::Matrix3d::Identity());
std::cout << "tf1:\n"<<tf1.matrix() << std::endl;
Eigen::Transform<double, 3, Eigen::Isometry> tf2(Eigen::AngleAxisd(M_PI/3,Eigen::Vector3d(1,2,3)));
std::cout << "tf2:\n"<<tf2.matrix() << std::endl;
3、传入一个QTransform类型
QTransform类型是Qt库中用于2D图形操作的类,包括平移、旋转、缩放和投影等操作。在使用时需要预定义 EIGEN_QT_SUPPORT
4、传入一个Transform类型
Eigen::Transform<double, 3, Eigen::Isometry> tf3(Eigen::Transform<double, 3, Eigen::Isometry>::Identity());
std::cout << "tf3:\n"<<tf3.matrix() << std::endl;
常见操作
1、旋转
Eigen::Transform<float, 3, Eigen::Affine> transform;
Eigen::AngleAxis<float> rotation(M_PI / 4, Eigen::Vector3f::UnitZ());
transform.rotate(rotation);
2、平移
Eigen::Transform<float, 3, Eigen::Affine> transform;
Eigen::Translation<float, 3> translation(1.0f, 2.0f, 3.0f);
transform.translate(translation);
3、缩放
Eigen::Transform<float, 3, Eigen::Affine> transform;
Eigen::AlignedScaling3f scaling(2.0f, 2.0f, 2.0f);
transform.scale(scaling);