正如标题所说,我在将 a 转换为 aQuaternion
时遇到问题Matrix4f
。Eigen
有Quaternion.toRotationMatrix()
给我的方法Matrix3f
。现在我需要一个Matrix4f
(因为我们的程序设计为只接受Matrix4f
),有没有简单的方法来实现这个?
问问题
12475 次
2 回答
5
M3 至 M4
Rob 和 Najzero 给出了答案。在大多数情况下,如下构造矩阵就足够了:
立方米:
|a00|a01|a02|
|a10|a11|a12|
|a20|a21|a22|
到 m4:
|a00|a01|a02| 0 |
|a10|a11|a12| 0 |
|a20|a21|a22| 0 |
| 0 | 0 | 0 | 1 |
4x4 矩阵不仅允许旋转矢量,还允许移动(平移)和缩放(在所有 3 个方向上)任何矢量。所以基本上你得到了一个完整的变换矩阵——这就是为什么它经常用在计算机图形学中,描述一个对象的变换。根据行列顺序,我们可以将矩阵标识为:
|rot|rot|rot| sx |
|rot|rot|rot| sy |
|rot|rot|rot| sz |
| x | y | z | 1 |
以 sx,sy,sz 作为比例系数,x,y,z 作为平移系数。
PS:当然,如果你想用 m4 旋转一个向量,你将不得不使用一个 4 维向量,例如 w=1 的 (x,y,z,w) (在大多数情况下)。
直接方法
我个人的建议是: http ://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/ 在那里你还会发现其他的转换,backtrafos 等等。
于 2013-04-02T13:33:43.537 回答
5
@Zacharias 的答案包含必要的理论。我只是重申我之前用实际的 Eigen C++ 代码所做的评论。
Eigen::Matrix3f mat3 = Eigen::Quaternionf(W, X, Y, Z).toRotationMatrix();
Eigen::Matrix4f mat4 = Eigen::Matrix4f::Identity();
mat4.block(0,0,3,3) = mat3;
Eigen::Matrix4f::Identity()
负责初始化第 4 行和最后一行和列的 1 和 0。mat4.block(0,0,3,3) = mat3
然后覆盖从旋转矩阵获得的值。
于 2019-06-07T09:13:40.540 回答