Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert a Eigen::Quaternion<float> to a Matrix4f?

As the title says, i have a problem to convert a Quaternion to a Matrix4f. Eigen has the method Quaternion.toRotationMatrix() which gives me a Matrix3f. Now i need a Matrix4f ( because our program is designed to take only Matrix4f), is there an easy way to achieve this?

like image 429
Captain GouLash Avatar asked Dec 26 '22 06:12

Captain GouLash


2 Answers

@Zacharias' answer contains the necessary theory. I just reiterate my earlier comment I made there with the actual Eigen C++ code.

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() takes care of initializing the ones and zeros of the 4th and last row and column. mat4.block(0,0,3,3) = mat3 then overwrites the values obtained from the rotation matrix.

like image 119
user1556435 Avatar answered Dec 28 '22 18:12

user1556435


M3 to M4

The answere is already there, given by Rob and Najzero. In most cases, it will be sufficient to construct the matrix as follows:

m3:

|a00|a01|a02|
|a10|a11|a12|
|a20|a21|a22|

to m4:

|a00|a01|a02| 0 | 
|a10|a11|a12| 0 | 
|a20|a21|a22| 0 |
| 0 | 0 | 0 | 1 |

The 4x4 matrix does not only allow to rotate a vector, but also to shift(translate) and scale (in all 3 directions) any vector. So basically you got a full transformation matrix - thats why it is often used in computer graphics, describing the transformation of an object. Depending on row-column order, we might identify the matrix as:

|rot|rot|rot| sx | 
|rot|rot|rot| sy | 
|rot|rot|rot| sz |
| x | y | z | 1 |

with sx,sy,sz as scaling coefficients, and x,y,z as translation coefficients.

PS: of course, if you want to rotate a vector with m4, you will than have to use a 4-dimensional vector, e.g. (x,y,z,w) with w=1 (in most cases).

The direct approach

Convert Quaternion rotation to rotation matrix?

And my personal recommendation: http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/ There you will find also other transformations, backtrafos and so on.

like image 40
Zacharias Avatar answered Dec 28 '22 18:12

Zacharias