Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 723
Pierluigi Avatar asked Apr 29 '13 13:04

Pierluigi


1 Answers

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()
like image 164
ggael Avatar answered Oct 07 '22 06:10

ggael