3dgeometryeigenhomogenous-transformation

Convert a vector of 3D point to homogeneous representation in Eigen


I have a buffer containing N 3D points stored as [XYZXYZXYZ ... XYZ].

This buffer can be directly mapped to a Eigen::Matrix<float, 3, N> using Eigen::Map. Since I will transform the points using affine transformations (i.e Eigen::Matrix4f matrices) I would like to map the same buffer to an eigen structure that allows me to consider the buffer as a Eigen::Matrix<float, 4, N> matrix where the last row only contains 1s, i.e. each single point is represented by the homogeneous vector [X Y Z 1].

Is there a convenient way to do this without copying the original buffer or applying the transformation on each single point?


Solution

  • You can apply homogenous() on each column like this:

    Matrix4f mat = ...; // your affine transformation stored as a 4x4 matrix
    float *data = ...;  // your raw buffer storing 3D point as [XYZXYZXYZ...]
    mat * Map<Matrix<float, 3, Dynamic> >(data,3,N).colwise().homogeneous()