Что вы здесь делаете:
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, вам вообще не нужны кватернионы. Матрицы вращения и кватернионы - это просто разные представления одного и того же.