使用 Eigen 库将仿射变换转换为等轴变换(即仅包含旋转和平移)的最简单方法是什么?
两种转换都是3D。仿射矩阵对于左上象限具有一般的3×3矩阵(即旋转,缩放和剪切),而等轴测图具有相同象限的3×3旋转矩阵,因此需要投影。
Eigen::AffineCompact3f a;
Eigen::Isometry3f b(a);
给出了编译错误:
错误C2338:YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION
同时
Eigen::AffineCompact3f a;
Eigen::Isometry3f b(a.rotation(), a.translation());
给出
(第2行)错误C2661:'Eigen :: Transform< _Scalar,_Dim,_Mode> :: Transform':没有重载函数需要2个参数
和
Eigen::AffineCompact3f a;
Eigen::Isometry3f b;
b.translation() = a.translation();
b.rotation() = a.rotation();
给出
(第4行)错误C2678:二进制'=':找不到左侧的操作符 'const Eigen :: Matrix< _Scalar,_Rows,_Cols>'类型的操作数(或那里 是不可接受的转换)
给定rotation()和translation()函数,问题可以改为“我如何最好地设置等距变换的旋转和平移组件?”
答案 0 :(得分:6)
.rotation()提取转换的旋转部分。它涉及一个SVD,因此它是只读的。在左侧,您必须使用.linear():
Eigen::AffineCompact3f a;
Eigen::Isometry3f b;
b.translation() = a.translation();
b.linear() = a.rotation();
如果您知道'a'是等距并且只想将其转换为Isometry 3f,那么您可以这样做:
b = a.matrix();