Eigen几何变换类 (Transform, Quaternion等)
1. Transform 类:仿射/射影变换
 
模板参数
cpp
Transform<Scalar, Dim, Mode, Options>-  Scalar:数据类型(如float,double)。
-  Dim:维度(2 或 3)。
-  Mode:变换类型:-  Affine(默认):仿射变换(平移+旋转+缩放)。
-  AffineCompact:无缩放项的仿射变换。
-  Projective:射影变换(含透视效果)。
 
-  
-  Options:存储顺序(ColMajor或RowMajor)。
核心属性与方法
| 方法/属性 | 参数说明 | 返回值/功能 | 示例 | 
|---|---|---|---|
| matrix() | 无 | 返回底层 4x4 变换矩阵 | Matrix4f m = t.matrix(); | 
| translate(Vector3f) | 平移向量 | 应用平移(修改自身) | t.translate(Vector3f(1, 0, 0)); | 
| rotate(Quaternionf) | 四元数或旋转矩阵 | 应用旋转 | t.rotate(AngleAxisf(M_PI/2, Vector3f::UnitZ())); | 
| scale(Scalar)或scale(Vector3f) | 统一缩放因子或各轴独立缩放 | 应用缩放 | t.scale(2.0); | 
| prescale(),prerotate(),pretranslate() | 类似上述方法,但右乘(先执行新变换) | 链式变换 | t.pretranslate(Vector3f(0, 1, 0)); | 
| inverse() | 无 | 返回逆变换 | Transform3f inv_t = t.inverse(); | 
| linear() | 无 | 返回线性部分(旋转+缩放,3x3矩阵) | Matrix3f R = t.linear(); | 
| translation() | 无 | 返回平移部分(向量) | Vector3f pos = t.translation(); | 
初始化方式
| 方法 | 示例 | 说明 | 
|---|---|---|
| 单位变换 | Transform3f t = Transform3f::Identity(); | 初始化为单位变换 | 
| 从旋转矩阵构造 | t.linear() = AngleAxisf(θ, axis).toRotationMatrix(); | 设置旋转部分 | 
2. Quaternion 类:三维旋转
 
模板参数
cpp
Quaternion<Scalar, Options>-  Scalar:数据类型(如float,double)。
-  Options:存储顺序(AutoAlign或DontAlign)。
核心属性与方法
| 方法/属性 | 参数说明 | 返回值/功能 | 示例 | 
|---|---|---|---|
| w(),x(),y(),z() | 无 | 访问四元数分量(实部 w,虚部x,y,z) | float qw = q.w(); | 
| coeffs() | 无 | 返回向量格式 [x, y, z, w] | Vector4f coeff = q.coeffs(); | 
| normalize() | 无 | 归一化四元数(修改自身) | q.normalize(); | 
| conjugate() | 无 | 返回共轭四元数 | Quaternionf q_conj = q.conjugate(); | 
| toRotationMatrix() | 无 | 转换为 3x3 旋转矩阵 | Matrix3f R = q.toRotationMatrix(); | 
| AngleAxis(angle, axis) | angle:弧度,axis:旋转轴(需归一化) | 从轴角构造四元数 | Quaternionf q = AngleAxisf(M_PI/2, Vector3f::UnitZ()); | 
| slerp(Scalar t, Quaternion other) | t:插值因子(0~1),other:目标四元数 | 球面线性插值 | Quaternionf q_interp = q1.slerp(0.5, q2); | 
初始化方式
| 方法 | 示例 | 说明 | 
|---|---|---|
| 直接构造 | Quaternionf q(w, x, y, z); | 注意参数顺序(w在前) | 
| 从旋转矩阵构造 | Quaternionf q(rotation_matrix); | 需矩阵正交 | 
3. 其他几何类
(1) AngleAxis(轴角表示)
 
| 方法/属性 | 参数说明 | 示例 | 
|---|---|---|
| angle() | 返回旋转角度(弧度) | float θ = aa.angle(); | 
| axis() | 返回旋转轴(需归一化) | Vector3f axis = aa.axis(); | 
| toRotationMatrix() | 转换为 3x3 旋转矩阵 | Matrix3f R = aa.toRotationMatrix(); | 
(2) Rotation2D(二维旋转)
 
| 方法 | 参数说明 | 示例 | 
|---|---|---|
| angle() | 返回旋转角度(弧度) | Rotation2Df rot(M_PI/4); | 
| toRotationMatrix() | 转换为 2x2 旋转矩阵 | Matrix2f R = rot.toRotationMatrix(); | 
4. 代码示例
组合变换(平移+旋转+缩放)
cpp
#include <Eigen/Geometry>
using namespace Eigen;// 初始化变换
Transform<float, 3, Affine> t = Transform<float, 3, Affine>::Identity();
t.translate(Vector3f(1, 2, 3));                      // 平移
t.rotate(Quaternionf(AngleAxisf(M_PI/2, Vector3f::UnitX()))); // 绕 X 轴旋转 90°
t.scale(0.5);                                        // 缩放// 应用变换到点
Vector3f p(0, 1, 0);
Vector3f p_transformed = t * p;  // 结果: (1, 2.5, 3)四元数插值
cpp
Quaternionf q1 = Quaternionf::Identity();
Quaternionf q2(AngleAxisf(M_PI/2, Vector3f::UnitZ()));
Quaternionf q_mid = q1.slerp(0.5, q2);  // 中间旋转5. 关键注意事项
-  变换顺序:Eigen 默认左乘(即 t.rotate()是相对于局部坐标系)。-  使用 prerotate()/pretranslate()可切换为右乘(相对于世界坐标系)。
 
-  
-  性能优化: -  对于纯旋转,直接使用 Quaternion或AngleAxis比Transform更高效。
-  频繁变换组合时,优先复用 Transform对象。
 
-  
-  归一化:四元数和旋转轴需手动归一化( normalize())。
6. 几何类对比
| 类名 | 最佳用途 | 内存占用 | 计算效率 | 
|---|---|---|---|
| Transform | 复合变换(平移+旋转+缩放) | 16 floats (3D) | 中等 | 
| Quaternion | 纯旋转/插值 | 4 floats | 高 | 
| AngleAxis | 轴角表示旋转 | 4 floats (3+1) | 低(需转换) | 
| Rotation2D | 二维旋转 | 1 float | 高 | 
掌握这些类后,可高效处理 2D/3D 空间中的几何变换!更多细节见 Eigen Geometry 文档。
