собственный С++; Евклидово преобразование с Eigen::Transform

Учитывая евклидово преобразование с помощью матрицы вращения 3x3 R и трехмерного вектора смещения t, как можно реализовать евклидово преобразование с помощью Eigen::Transform?

X = R * X + t

Мой текущий подход не работает:

Eigen::Transform<Type, 3, Eigen::Projective>  transformation;
...

Eigen::AngleAxis           rotation(R);
Eigen::Translation<Type,3> translation(t);

transformation = translation * rotation;

Теперь я хочу применить его по столбцам к большему набору векторов, то есть к матрице 3xN X, где каждый столбец представляет вектор, который нужно преобразовать, т.е.

 X = transformation * X

Но это не работает и выдает утверждение:

test-depth.exe: /usr/include/eigen3/Eigen/src/Core/Product.h:133: Eigen::Product<Lhs, Rhs, Option>::Product(const Lhs&, const Rhs&) [with _Lhs = Eigen::Matrix<double, 4, 4>; _Rhs = Eigen::Matrix<double, -1, -1>; int Option = 0; Eigen::Product<Lhs, Rhs, Option>::Lhs = Eigen::Matrix<double, 4, 4>; Eigen::Product<Lhs, Rhs, Option>::Rhs = Eigen::Matrix<double, -1, -1>]: Assertion `lhs.cols() == rhs.rows() && "invalid matrix product" && "if you wanted a coeff-wise or a dot product use the respective explicit functions"' failed.

person Frank-Rene Schäfer    schedule 22.01.2018    source источник
comment
X должен быть вектором 4*1 того же типа   -  person Humam Helfawi    schedule 22.01.2018
comment
Вы имеете в виду, что внутри он генерирует матрицу 4x3 для объединения вращения и перемещения. Но действительно ли это заставляет меня генерировать элемент четвертого измерения? Есть ли элегантный способ обойти это?   -  person Frank-Rene Schäfer    schedule 22.01.2018
comment
Почитайте про однородные координаты. Кстати, вам действительно нужно Projectiveа не Affine?   -  person MBo    schedule 22.01.2018


Ответы (1)


Комментарий MBo правильный, вы использовали преобразование Projective, которое включает в себя полные однородные координаты для работы. Вам нужно использовать преобразование Affine или AffineCompact, если вы хотите использовать матрицу 3x4 под капотом.

person ggael    schedule 22.01.2018
comment
Я ожидаю, что есть способ обойти трансформируемое четвертое измерение вектора. Это всегда «1». Я думал, что это может быть добавлено внутрь, эффективно. - person Frank-Rene Schäfer; 23.01.2018
comment
В 3D проективное преобразование представлено произвольной матрицей 4x4, поэтому 4-й компонент вывода нельзя угадать, и мы не хотим молча выполнять перспективное деление, которое также может быть делением на ноль. - person ggael; 23.01.2018