You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Eigen::Affine3d提取旋转(存为Quaterniond)和平移(存为Vector3d)

从Eigen::Affine3d提取旋转与平移分量

Eigen里的Affine3d本质是一个4x4的齐次变换矩阵,对应刚体变换(旋转+平移)时,你可以直接通过内置方法拆分出平移和旋转分量:

提取平移分量

直接调用translation()方法即可得到Vector3d类型的平移向量:

// 假设你已经有一个构造好的Affine3d对象
Eigen::Affine3d affine_transform;

// 提取平移
Eigen::Vector3d translation = affine_transform.translation();

提取旋转分量(转为Quaterniond)

Affine3d的linear()方法会返回左上角的3x3线性变换矩阵,如果你的变换是纯刚体旋转(无缩放、剪切),这个矩阵就是正交旋转矩阵,可以直接用来构造Quaterniond:

// 提取3x3旋转矩阵
Eigen::Matrix3d rotation_matrix = affine_transform.linear();

// 从旋转矩阵构造四元数
Eigen::Quaterniond rotation_quat(rotation_matrix);

// 若存在数值精度问题,可归一化确保是单位四元数
rotation_quat.normalize();

补充说明

  • Affine3d的齐次矩阵结构中,第四列的前三个元素就是平移向量,translation()方法直接返回这部分数据;
  • 若你的Affine3d包含缩放或剪切操作,linear()返回的矩阵不是正交矩阵,此时转四元数会出错——这种情况下你需要先做矩阵分解(比如使用Eigen::Affine3d::decompose()或SVD分解)来分离纯旋转部分,但通常刚体变换场景下不需要这一步。

内容的提问来源于stack exchange,提问作者Zhang Zheng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:45:30