c++ - 特征::矩阵到 Eigen::Quaterniond
问题描述
Eigen::Matrix4d transformation_matrix; //assume this is initialized
Eigen::Matrix4d &matrix = transformation_matrix;
Eigen::Quaterniond quat;
quat(matrix);
我试图从变换矩阵中找到一个旋转矩阵。Eigen::Quaterniond
library中已经有一个 API toRotationMatrix
。但是要使用它,我需要一个 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());
解决方案
你在这里做什么:
Eigen::Quaterniond quat;
quat(matrix);
正在创建一个四元数,然后operator()
用矩阵调用它。但据我所知,四元数甚至没有operator()
任何东西:文档
看看你提到的问题中 ggael 的第一个答案。您可以使用四元数的构造函数:
Eigen::Quaterniond quat(matrix);
或者它的赋值运算符:
Eigen::Quaterniond quat;
quat = matrix;
两者都是为矩阵定义的。但是,我不能告诉你,它们是否适用于 4x4 矩阵。如果不提取矩阵的 3x3 旋转部分。
编辑:
在我的计算机上进行快速测试后,您无法将 4x4 矩阵传递给四元数。要么使用 aEigen::Matrix3d
代替,要么执行以下操作:
Eigen::Quaterniond quat(matrix.topLeftCorner<3, 3>());
编辑2:
我试图从变换矩阵中找到一个旋转矩阵。Eigen::Quaterniond 库中已经有一个 API toRotationMatrix。但要使用它,我需要一个 4x4 四元数(如果这是错误的,请更正)。
嗯,这并不正确。可以将旋转矩阵转换为四元数,将四元数转换为旋转矩阵。在 4x4 矩阵中,旋转部分包含在左上角的 3x3 子矩阵中。但是,在一般的变换矩阵中,这部分不一定只是旋转。它还可以包含其他转换,例如缩放。在这种情况下,我不确定是否可以直接将其转换为四元数而无需先提取旋转部分。我对此表示怀疑,但我不确定。但是,如果你有一个通用的变换矩阵,你可以通过计算它的行列式来测试上面的 3x3 部分是否是纯旋转。如果为 1,则表示纯旋转。如果不是这种情况,请查看此链接计算旋转部分。如果您的目标是仅提取 4x4 矩阵的旋转,则根本不需要四元数。旋转矩阵和四元数只是同一事物的不同表示。
推荐阅读
- assembly - CS:覆盖访问 IDA 输出中的全局变量,如 mov eax、cs:x?
- javascript - 独家反应状态钩子
- sqlite - 架构错误:错误:SQLITE_ERROR:添加触发器以检查返回时输入不完整(如果日期在未来)
- sql - 错误:无法在非数组上调用 json_array_elements
- android - Firestore 不根据时间戳对我的结果进行排序
- javascript - 重新加载页面时无法读取未定义的属性“ArtisanID”
- android - ScrollView.js:BlockStatement 的属性主体 [41] 预期节点的类型为 [“Statement”],但得到“AssignmentExpression”
- arrays - 如何在kotlin中获取mutableList的mutableList?
- r - 在 R 中创建一个新的 cloumn
- string - 用相应列中提供的文件的数字相应第 n 行替换两个不同列上第 n 次出现的 'foo' 和 'bar'