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

Creating homogeneous coordinate with w != 1 in Eigen

我的目标是通过在 3 向量的末尾附加 0 将 3D 方向向量转换为齐次 space。我没有看到将向量转换为 w 不等于 1 的齐次 space 的干净方法?

例如,看起来像这样的东西,但用 "something()" 替换会很棒:

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分量,那还是会好很多。

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

direction << direction.normalized(), 0;

或在初始化列表中:

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