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