【问题标题】:Construct Eigen::Transform from Eigen::Translation从 Eigen::Translation 构造 Eigen::Transform
【发布时间】:2014-06-16 14:17:13
【问题描述】:

我有以下代码:

void mySetTransform(const Eigen::Affine3d& T);
...
mySetTransform(Eigen::Translation3d(1.0,2.0,3.0));

这不会编译,它无法将Eigen::Translation3d 转换为Eigen::Affine3d。以下行导致相同的错误:

Eigen::Affine3d test = Eigen::Translation3d(r);

但这很好:

Eigen::Affine3d test;
test = Eigen::Translation3d(r);

所以,看起来= 运算符工作正常,但是没有定义使用Eigen::Translation3d 构建Eigen::Affine3d 的构造函数。

文档中有以下 note 用于 Translation 类:

这个类不是用来存储翻译的 转换,而是使构造和 Transform 对象的更新。

有什么方法可以声明上述函数,以便可以使用任何转换对象(如在 Eigen/Geomerty 中声明的Translation)直接调用它(不使用临时变量)?

【问题讨论】:

    标签: c++ eigen3


    【解决方案1】:

    这是因为 Transform from a Translation 的构造函数是显式的。所以你必须明确地调用它:

    Translation3d t(1.0,2.0,3.0);
    mySetTransform(Affine3f(t));
    

    让我们考虑以下两个例子:

    Affine3d test1(t);  // OK
    Affine3d test2 = t; // NOT OK
    

    即使在这两种情况下都是调用的构造函数(不是 operator=),但对于显式构造函数,只有第一个是可以的。这是标准的 C++ 规则。当然你也可以这样做:

    Affine3d test3 = Affine3d(t); // OK
    

    【讨论】:

    • 感谢您的回答。在我的问题开头调用该函数适用于mySetTransform(Eigen::Affine3d(Eigen::Translation3d(1.0,2.0,3.0)));。将构造函数声明为 explicit 会使该示例中的代码可读性稍差。我认为有一个明确的 ctor 是有充分理由的;如果您能准确说明为什么它是明确的,我将不胜感激。
    • 本质上是为了防止意外开销。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多