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 文档。