在计算机图形学、机器人学和SLAM(同步定位与建图)等领域,三维空间中的点、向量、旋转和平移等几何变换是基础而关键的操作。C++中的Eigen库提供了一个强大且高效的几何模块(Geometry Module),专门用于处理这些任务。本文将带你从零开始,轻松掌握Eigen几何模块的核心功能,即使你是编程小白也能看懂!
Eigen是一个开源的C++模板库,用于线性代数、矩阵和向量运算。其几何模块(属于Eigen3的一部分)提供了对旋转、平移、缩放、仿射变换等操作的封装,支持多种表示方式,如:
Eigen是纯头文件库,无需编译。你只需从官网下载并解压,然后在代码中包含相关头文件即可。
#include <Eigen/Geometry>#include <iostream>using namespace std;using namespace Eigen;
四元数是表示3D旋转的高效方式。下面展示如何创建一个绕Z轴旋转90度的四元数:
// 绕Z轴旋转90度(π/2 弧度)AngleAxisd rotation_vector(M_PI/2, Vector3d::UnitZ());Quaterniond q(rotation_vector);// 或者直接构造Quaterniond q2 = Quaterniond(AngleAxisd(M_PI/2, Vector3d::UnitZ()));// 输出四元数cout << "Quaternion: " << q.coeffs().transpose() << endl;// 注意:coeffs() 返回 [x, y, z, w]
假设有一个点 (1, 0, 0),我们想用上面的四元数将其绕Z轴旋转90度:
Vector3d point(1, 0, 0);Vector3d rotated_point = q * point; // 四元数左乘向量cout << "Original point: " << point.transpose() << endl;cout << "Rotated point: " << rotated_point.transpose() << endl;// 输出应为 (0, 1, 0)
在实际应用中,我们常需要同时处理旋转和平移。Eigen提供了 Isometry3d 类来表示刚体变换(即 SE(3) 群中的元素):
// 创建变换矩阵Isometry3d T = Isometry3d::Identity(); // 初始化为单位变换// 设置旋转(使用四元数)T.rotate(q);// 设置平移T.pretranslate(Vector3d(1, 2, 3)); // 先平移再旋转?注意顺序!// 或者:T.translate(Vector3d(1,2,3)); // 旋转后再平移// 变换一个点Vector3d new_point = T * point;cout << "Transformed point: " << new_point.transpose() << endl;// 获取内部的4x4矩阵cout << "Transformation matrix:\n" << T.matrix() << endl;
Eigen允许你在四元数、旋转矩阵、欧拉角之间自由转换,非常方便:
// 从四元数获取旋转矩阵Matrix3d R = q.toRotationMatrix();// 从旋转矩阵构造四元数Quaterniond q_from_R(R);// 转换为欧拉角(ZYX顺序,即 yaw-pitch-roll)Vector3d euler_angles = q.toRotationMatrix().eulerAngles(2, 1, 0); // Z=2, Y=1, X=0cout << "Euler angles (yaw, pitch, roll): " << euler_angles.transpose() * 180 / M_PI << " degrees" << endl;
q.normalize()。Affine3d 或直接使用矩阵乘法以提高效率。通过本文,你已经掌握了Eigen几何模块的基本用法,包括四元数、旋转变换、刚体变换以及不同表示之间的转换。这些知识是进行3D视觉、机器人控制和游戏开发的基石。
记住,实践是最好的老师。尝试修改代码中的角度、轴和点坐标,观察输出变化,你会更快地理解这些概念。希望这篇教程能帮助你在C++矩阵运算和三维几何的世界中迈出坚实的一步!
关键词:Eigen几何模块, Eigen3旋转变换, Eigen四元数, C++矩阵运算
本文由主机测评网于2025-12-10发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025125559.html