当前位置: 首页 > news >正文

Eigen几何变换类 (Transform, Quaternion等)

1. Transform 类:仿射/射影变换

模板参数

cpp

Transform<Scalar, Dim, Mode, Options>
  • Scalar:数据类型(如 floatdouble)。

  • 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:数据类型(如 floatdouble)。

  • Options:存储顺序(AutoAlign 或 DontAlign)。

核心属性与方法
方法/属性参数说明返回值/功能示例
w()x()y()z()访问四元数分量(实部 w,虚部 x,y,zfloat 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. 关键注意事项

  1. 变换顺序:Eigen 默认左乘(即 t.rotate() 是相对于局部坐标系)。

    • 使用 prerotate()/pretranslate() 可切换为右乘(相对于世界坐标系)。

  2. 性能优化

    • 对于纯旋转,直接使用 Quaternion 或 AngleAxis 比 Transform 更高效。

    • 频繁变换组合时,优先复用 Transform 对象。

  3. 归一化:四元数和旋转轴需手动归一化(normalize())。

6. 几何类对比

类名最佳用途内存占用计算效率
Transform复合变换(平移+旋转+缩放)16 floats (3D)中等
Quaternion纯旋转/插值4 floats
AngleAxis轴角表示旋转4 floats (3+1)低(需转换)
Rotation2D二维旋转1 float

掌握这些类后,可高效处理 2D/3D 空间中的几何变换!更多细节见 Eigen Geometry 文档。

相关文章:

  • 学习笔记:Qlib 量化投资平台框架 — GETTING STARTED
  • 将服务器接到路由器上访问
  • 【Leetcode 每日一题】2444. 统计定界子数组的数目
  • 图像特征检测算法对比及说明
  • 2025.4.26总结
  • ADC单通道采集实验
  • 3:QT联合HALCON编程—海康相机SDK二次程序开发
  • Android12源码编译及刷机
  • 详解Adobe Photoshop 2024 下载与安装教程
  • 论文笔记(八十)π0.5: a Vision-Language-Action Model with Open-World Generalization
  • Python并行计算:2.Python多线程编程:threading模块详解与守护线程实战
  • Spring Boot 3.4 实战指南:从性能优化到云原生增强
  • Spring Boot安装指南
  • Java后端开发——分层解耦详解
  • [mysql]数据类型精讲下
  • 用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1
  • Synology HDD db - 群晖硬盘兼容性数据库工具
  • Linux0.11内存管理:相关代码
  • DeepSeek系列(9):团队协作最佳实践
  • 数字喜好判断之谜
  • 从腰缠万贯到债台高筑、官司缠身:尼泊尔保皇新星即将陨落?
  • 诗词文赋俱当歌,听一听古诗词中的音乐性
  • 点燃“文化活火”,上海百年街区创新讲述“文化三地”故事
  • 演员孙俪:中年人没有脆弱的时间,学习胡曼黎不内耗
  • 泽连斯基与特朗普进行简短会谈
  • 甘肃省原副省长赵金云被开除公职,甘肃省委表态:坚决拥护党中央决定