4

正如标题所说,我在将 a 转换为 aQuaternion时遇到问题Matrix4fEigenQuaternion.toRotationMatrix()给我的方法Matrix3f。现在我需要一个Matrix4f(因为我们的程序设计为只接受Matrix4f),有没有简单的方法来实现这个?

4

2 回答 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 回答