如何将Eigen :: Quaternion <float>转换为Matrix4f?

Cap*_*ash 3 c++ matrix quaternions

正如标题所说,我有一个问题,即转换Quaternion为a Matrix4f.EigenQuaternion.toRotationMatrix()给我一个方法Matrix3f.现在我需要一个Matrix4f(因为我们的程序只是设计Matrix4f),有没有一种简单的方法来实现这一目标?

Zac*_*ias 5

M3到M4

回答已经存在,由Rob和Najzero提供.在大多数情况下,构建矩阵就足够了,如下所示:

M3:

|a00|a01|a02|
|a10|a11|a12|
|a20|a21|a22|
Run Code Online (Sandbox Code Playgroud)

到m4:

|a00|a01|a02| 0 | 
|a10|a11|a12| 0 | 
|a20|a21|a22| 0 |
| 0 | 0 | 0 | 1 |
Run Code Online (Sandbox Code Playgroud)

4x4矩阵不仅允许旋转矢量,还允许移动(平移)和缩放(在所有3个方向上)任何矢量.所以基本上你有一个完整的转换矩阵 - 这就是为什么它经常用在计算机图形中,描述一个对象的转换.根据行列顺序,我们可能将矩阵标识为:

|rot|rot|rot| sx | 
|rot|rot|rot| sy | 
|rot|rot|rot| sz |
| x | y | z | 1 |
Run Code Online (Sandbox Code Playgroud)

sx,sy,sz作为缩放系数,x,y,z作为平移系数.

PS:当然,如果你想用m4旋转矢量,你将不得不使用一个4维向量,例如(x,y,z,w),w = 1(在大多数情况下).

直接的方法

将四元数旋转转换为旋转矩阵?

我的个人推荐:http: //www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/ 在那里你还可以找到其他的转换,反向传输等等.

  • `Eigen::Matrix3f mat3 = Eigen::Quaternionf(W, X, Y, Z).toRotationMatrix(); Eigen::Matrix4f mat4 = Eigen::Matrix4f::Identity(); mat4.block(0,0,3,3) = mat3;` (4认同)

use*_*435 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;
Run Code Online (Sandbox Code Playgroud)

Eigen::Matrix4f::Identity()负责初始化第 4 行和最后一行和列的 1 和 0。mat4.block(0,0,3,3) = mat3然后覆盖从旋转矩阵获得的值。