Как преобразовать Eigen :: Quaternion ‹float› в Matrix4f?

Как сказано в названии, у меня проблема с преобразованием Quaternion в Matrix4f. Eigen имеет метод Quaternion.toRotationMatrix(), который дает мне Matrix3f. Теперь мне нужен Matrix4f (поскольку наша программа рассчитана на использование только Matrix4f), есть ли простой способ добиться этого?


person Captain GouLash    schedule 02.04.2013    source источник
comment
Это зависит от приложения, но вы можете попробовать создать Matrix4f с тремя компонентами Matrix3f плюс 1 в качестве четвертого (w) компонента. Но, как я уже сказал, это определенно зависит от приложения - не все кватернионы даже представляют матрицы вращения.   -  person Rob I    schedule 02.04.2013
comment
Второй комментарий Роба I. Большинство реализаций матриц принимают 4-й столбец как вектор положения и 4-ю строку как масштабирование.   -  person Najzero    schedule 02.04.2013


Ответы (2)


M3 в M4

Ответ уже есть, предоставленный Робом и Найзеро. В большинстве случаев достаточно построить матрицу следующим образом:

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 |

Матрица 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-мерный вектор, например. (x, y, z, w) с w = 1 (в большинстве случаев).

Прямой подход

Преобразовать поворот кватерниона в матрицу поворота?

И моя личная рекомендация: http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/ Там вы найдете также другие преобразования, обратные преобразования и так далее.

person Zacharias    schedule 02.04.2013
comment
@ user1556435, вы должны опубликовать это как ответ - person Gabriel Devillers; 05.06.2019

Ответ @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() заботится об инициализации единиц и нулей четвертой и последней строки и столбца. mat4.block(0,0,3,3) = mat3 затем перезаписывает значения, полученные из матрицы вращения.

person user1556435    schedule 07.06.2019