c++ - 将 Eigen 仿射变换转换为 Eigen 等距变换

标签 c++ transform eigen

使用 Eigen 将仿射变换转换为等距变换(即仅由旋转和平移组成)的最简单方法是什么? 图书馆?

两种变换都是 3D 的。仿射矩阵在左上象限有一个通用的 3x3 矩阵(即旋转、缩放和剪切),而等轴测在同一象限有一个 3x3 旋转矩阵,因此需要投影。

Eigen::AffineCompact3f a;
Eigen::Isometry3f b(a); 

给出编译错误:

error C2338: YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION

同时

Eigen::AffineCompact3f a;
Eigen::Isometry3f b(a.rotation(), a.translation()); 

给予

(line 2) error C2661: 'Eigen::Transform<_Scalar,_Dim,_Mode>::Transform' : no overloaded function takes 2 arguments

Eigen::AffineCompact3f a;
Eigen::Isometry3f b;
b.translation() = a.translation();
b.rotation() = a.rotation();

给予

(line 4) error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Eigen::Matrix<_Scalar,_Rows,_Cols>' (or there is no acceptable conversion)

鉴于 rotation() 和 translation() 函数,问题可以改写为“如何最好地设置等距变换的旋转和平移分量?”

最佳答案

.rotation() 提取变换的旋转部分。它涉及一个 SVD,因此它是只读的。在左侧,您必须使用 .linear():

Eigen::AffineCompact3f a;
Eigen::Isometry3f b;
b.translation() = a.translation();
b.linear() = a.rotation();

如果您知道“a”是一个等距图并且只想将其转换为等距图 3f,您可以简单地执行以下操作:

b = a.matrix();

关于c++ - 将 Eigen 仿射变换转换为 Eigen 等距变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13956953/

相关文章:

c++ - 我可以从不是由 nvcc 编译的 C++ 代码调用 CUDA 运行时函数吗?

ios - 从中心以外的点缩放 UIView,寻找 anchorPoint 的替代方法

CSS transition 和 transform-style 不适用于移动设备

templates - Eigen 中 PlainObjectBase 和 DenseBase 的区别

eigen - 使用 Eigen Vector3d 容器创建 PCL 点云

c++ - 硬币找零 DP 算法打印所有组合

c++ - 在 C++ 中使用 "this"构造函数?

ios - XCode IOS Apple LLVM 3.1 - Eigen NEON 中断

C++ Unresolved token 问题

xaml - WP 8.1 自下而上无限滚动