【问题标题】:Convert an Eigen affine transformation to an Eigen isometry transformation将本征仿射变换转换为本征等距变换
【发布时间】:2012-12-07 01:47:48
【问题描述】:

使用 Eigen 库将仿射变换转换为等距变换(即仅包含旋转和平移)的最简单方法是什么?

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

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>::Transform':没有重载函数需要 2 个参数

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

给予

(第 4 行)错误 C2678:二进制“=”:未找到采用左手的运算符 'const Eigen::Matrix<_scalar>' 类型的操作数(或那里 是不可接受的转换)

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

【问题讨论】:

  • 您应该指定您使用的库或工具包,因为它们不是标准的 C++ 类型或名称。
  • 我正在使用 Eigen(一个著名的 C++ 数学库),正如我在标题和正文中所述。我将添加一个链接以使其更清晰。

标签: c++ transform eigen


【解决方案1】:

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

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

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

b = a.matrix();

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 2013-07-04
    • 2017-05-23
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多