在Eigen中用w!= 1创建齐次坐标

时间:2018-02-27 06:05:12

标签: c++ c++14 eigen eigen3

我的目标是通过在3向量的末尾附加0来将3D方向向量转换为同质空间。我没有看到一个干净的方法将一个向量转换为一个w不等于1的同质空间?

例如,看起来像这样的东西,但是"某些东西()"取而代之的会很棒:

template <typename FT>
Ray<FT>::Ray(Eigen::Matrix<FT, 3, 1> const & origin,
             Eigen::Matrix<FT, 3, 1> const & direction)
    : _origin(origin.homogeneous())
    , _direction(direction.normalized().something()) {}

仔细阅读文档https://eigen.tuxfamily.org/dox/group__Geometry__Module.html,我没有看到一种简单的方法来做到这一点,而无需在内部创建单独的向量,我不想这样做。

我有什么遗失的东西吗?

编辑:这似乎有效,但必须有更好的方法。

template <typename FT>
Ray<FT>::Ray(Eigen::Matrix<FT, 3, 1> const & origin,
             Eigen::Matrix<FT, 3, 1> const & direction)
    : _origin(origin.homogeneous())
    , _direction(direction.normalized().homogeneous() - Eigen::Matrix<FT, 4, 1>(0, 0, 0, 1)) {
    }

这适用于我的情况,但它在任何方面都不理想。如果某人有更好的方法在构造均匀向量时设置向量的w分量,那仍然会好得多。

1 个答案:

答案 0 :(得分:0)

您可以使用逗号初始化程序语法:

direction << direction.normalized(), 0;

或在初始化列表中:

: _direction((Vector4d() << direction.normalized(), 0).finished())