Как сказано в названии, у меня проблема с преобразованием Quaternion
в Matrix4f
. Eigen
имеет метод Quaternion.toRotationMatrix()
, который дает мне Matrix3f
. Теперь мне нужен Matrix4f
(поскольку наша программа рассчитана на использование только Matrix4f
), есть ли простой способ добиться этого?
Как преобразовать Eigen :: Quaternion ‹float› в Matrix4f?
Ответы (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/ Там вы найдете также другие преобразования, обратные преобразования и так далее.
Ответ @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
затем перезаписывает значения, полученные из матрицы вращения.
Matrix4f
с тремя компонентамиMatrix3f
плюс1
в качестве четвертого (w
) компонента. Но, как я уже сказал, это определенно зависит от приложения - не все кватернионы даже представляют матрицы вращения. - person Rob I   schedule 02.04.2013