Eigen的Transform类

Eigen库中的Transform类用于表示各种线性变换,如平移、旋转、缩放等,它支持不同的模式来表示不同类型的变换。下面是对这些模式的介绍:

  1. Affine(仿射变换):
    Affine模式表示一种保持直线平行性质的线性变换,包括平移、旋转、缩放和错切等。在Affine模式下,可以表示任意线性组合的这些变换,即平移、旋转、缩放、错切的组合。这种变换不会改变物体之间的相对位置关系,只会改变其大小、形状和方向。

  2. AffineCompact(紧凑仿射变换):
    AffineCompact模式与Affine模式类似,但它只表示平移、旋转和缩放,不包括错切变换。这使得该模式下的变换更加紧凑,适用于不涉及错切的情况。

  3. Projective(投影变换):
    Projective模式表示一种更一般化的变换,包括了仿射变换,并且允许透视投影。透视投影会改变物体的大小、形状、方向以及位置关系。这种变换可以用于模拟3D场景中的相机投影操作,例如将3D坐标映射到2D图像上。

  4. 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);
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`Eigen::Transform`是Eigen库中的一个,用于表示仿射变换或投影变换。它是一个模板,可以用于表示不同维度、不同型的变换矩阵。 `Eigen::Transform`的定义如下: ```cpp template<typename _Scalar, int _Dim, int _Mode, int _Options> class Transform; ``` 其中,`_Scalar`表示矩阵中元素的数据型,`_Dim`表示变换的维度,`_Mode`表示变换的模式,`_Options`表示矩阵的存储选项。 `Eigen::Transform`提供了一些成员函数,用于进行变换操作,例如: - `translate()`:进行平移变换; - `rotate()`:进行旋转变换; - `scale()`:进行缩放变换; - `shear()`:进行剪切变换; - `matrix()`:获取变换矩阵。 例如,我们可以使用以下代码创建一个3D仿射变换,并进行平移、旋转、缩放操作: ```cpp Eigen::Transform<double, 3, Eigen::Affine> transform; transform.translate(Eigen::Vector3d(1.0, 2.0, 3.0)); transform.rotate(Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d::UnitX())); transform.scale(Eigen::Vector3d(2.0, 1.0, 0.5)); ``` 这里创建了一个3D仿射变换`transform`,首先进行了一个沿着坐标轴方向的平移变换,然后进行了一个绕x轴旋转45度的旋转变换,最后进行了一个沿着坐标轴方向的缩放变换。 我们可以使用`matrix()`函数获取变换矩阵: ```cpp Eigen::Matrix4d matrix = transform.matrix(); ``` 这里获取了变换矩阵`matrix`,型为`Eigen::Matrix4d`,表示一个4x4的双精度浮点数矩阵。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值