如何从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
相关产品推荐
相关产品推荐

