将特征仿射变换转换为特征等距变换

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()函数,问题可以改为"我如何最好地设置等距变换的旋转和平移组件?"

gga*_*ael 7

.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)