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

时间:2012-12-19 16:37:56

标签: c++ transform eigen

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

1 个答案:

答案 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();