Эйген :: Матрица в Эйген :: Quaterniond - PullRequest
0 голосов
/ 19 марта 2020
Eigen::Matrix4d transformation_matrix; //assume this is initialized
Eigen::Matrix4d &matrix = transformation_matrix;   
Eigen::Quaterniond quat;
quat(matrix);

Я пытаюсь найти матрицу вращения из матрицы преобразования. В Eigen::Quaterniond библиотеке toRotationMatrix уже есть API. Но чтобы использовать это, мне нужно 4x4 Quaterniond (пожалуйста, исправьте, если это не так).

Получение ошибки компиляции как

error: no match for call to ‘(Eigen::Quaterniond {aka Eigen::Quaternion<double>}) (const Matrix4d&)’

Пожалуйста, помогите. Перешел по этой ссылке для конвертации

Eigen::Quaterniond quat;
quat(matrix);    

При инициализации Quaterniond появляется другая ошибка:

Eigen::internal::quaternionbase_assign_impl<Eigen::Matrix<double, 4, 4>, 4, 4>’ used in nested name specifier
   internal::quaternionbase_assign_impl<MatrixDerived>::run(*this, xpr.derived());

1 Ответ

0 голосов
/ 19 марта 2020

Что вы здесь делаете:

Eigen::Quaterniond quat;
quat(matrix);

создает кватернион, а затем вызывает его operator() с матрицей. Но, насколько я понимаю, у Quaternion даже нет operator() для чего-либо: документация

Посмотрите на первый ответ ggael на вопрос , который вы упомянуто . Вы можете использовать конструктор кватерниона:

Eigen::Quaterniond quat(matrix);

или его оператор присваивания:

Eigen::Quaterniond quat;
quat = matrix;

Оба определены для матрицы. Однако я не могу вам сказать, работают ли они для матриц 4х4. Если не извлекать вращающуюся часть матрицы 3x3.

Редактировать:

После быстрого теста на моем компьютере нельзя передать матрицу 4x4 кватерниону. , Или используйте Eigen::Matrix3d вместо этого или сделайте что-то вроде этого:

Eigen::Quaterniond quat(matrix.topLeftCorner<3, 3>());

Редактировать 2:

Я пытаюсь найти матрицу вращения из матрица преобразования. В библиотеке Eigen :: Quaterniond уже есть API toRotationMatrix. Но чтобы использовать это, мне нужен Quaterniond 4x4 (пожалуйста, исправьте, если это не так).

Ну, это не совсем правильно. Матрица вращения может быть преобразована в кватернион, а кватернион - в матрицу вращения. В матрице 4x4 часть вращения содержится внутри верхней левой подматрицы 3x3. Однако в общей матрице преобразования эта часть не обязательно является только вращением. Он также может содержать другие преобразования, такие как масштабирование. В этом случае я не уверен, сможете ли вы преобразовать его непосредственно в кватернион, не извлекая сначала вращательную часть. Я сомневаюсь в этом, но я не уверен в этом. Однако, если у вас есть общая матрица преобразования, вы можете проверить, является ли верхняя часть 3x3 чистым вращением, вычислив ее определитель. Если это 1, у вас есть чистое вращение. Если это не так, взгляните на эту ссылку , чтобы вычислить вращательную часть. Если ваша цель состоит в том, чтобы извлечь только вращение матрицы 4x4, вам вообще не нужны кватернионы. Матрицы вращения и кватернионы - это просто разные представления одного и того же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...