Преобразование собственного аффинного преобразования в преобразование собственной изометрии

Какой самый простой способ преобразовать аффинное преобразование в изометрическое преобразование (т.е. состоящее только из поворота и перемещения), используя собственный библиотека?

Обе трансформации 3D. Аффинная матрица имеет общую матрицу 3х3 (то есть вращение, масштабирование и сдвиг) для верхнего левого квадранта, тогда как изометрия имеет матрицу вращения 3х3 для того же квадранта, поэтому требуется проекция.

Eigen::AffineCompact3f a;
Eigen::Isometry3f b(a);

выдает ошибку компиляции:

ошибка C2338: YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION

в то время как

Eigen::AffineCompact3f a;
Eigen::Isometry3f b(a.rotation(), a.translation());

дает

(строка 2) ошибка C2661: ‘Eigen :: Transform<_Scalar, _Dim, _Mode> :: Transform ‘: ни одна перегруженная функция не принимает 2 аргумента

а также

Eigen::AffineCompact3f a;
Eigen::Isometry3f b;
b.translation() = a.translation();
b.rotation() = a.rotation();

дает

(строка 4) ошибка C2678: бинарный ‘=’: не найден оператор, который занимает левую руку
операнд типа ‘const Eigen :: Matrix<_Scalar, _Rows, _Cols> ‘(или там
нет приемлемого преобразования)

Учитывая функции вращение () и перевод (), вопрос можно перефразировать следующим образом: «Как лучше всего установить компоненты поворота и перемещения изометрического преобразования?»

5

Решение

.вращение () извлекает вращение часть преобразования. Это включает SVD, и, таким образом, это только для чтения. В левой части вы должны использовать .linear ():

Eigen::AffineCompact3f a;
Eigen::Isometry3f b;
b.translation() = a.translation();
b.linear() = a.rotation();

Если вы знаете, что «a» является изометрией и хотите только привести ее к Isometry 3f, вы можете просто сделать:

b = a.matrix();
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]