Преобразовать вращение Кватерниона в матрицу вращения?

Мы используем управление Написанием RAD Telerik в наших приложениях ASP.NET.

Написание RAD Telerik

17
задан genpfault 26 November 2013 в 23:28
поделиться

2 ответа

Следующий код основан на кватернионе (qw, qx, qy, qz), где порядок основан на кватернионах Boost:

boost::math::quaternion<float> quaternion;
float qw = quaternion.R_component_1();
float qx = quaternion.R_component_2();
float qy = quaternion.R_component_3();
float qz = quaternion.R_component_4();

Первый вам нужно нормализовать кватернион:

const float n = 1.0f/sqrt(qx*qx+qy*qy+qz*qz+qw*qw);
qx *= n;
qy *= n;
qz *= n;
qw *= n;

Затем вы можете создать свою матрицу:

Matrix<float, 4>(
    1.0f - 2.0f*qy*qy - 2.0f*qz*qz, 2.0f*qx*qy - 2.0f*qz*qw, 2.0f*qx*qz + 2.0f*qy*qw, 0.0f,
    2.0f*qx*qy + 2.0f*qz*qw, 1.0f - 2.0f*qx*qx - 2.0f*qz*qz, 2.0f*qy*qz - 2.0f*qx*qw, 0.0f,
    2.0f*qx*qz - 2.0f*qy*qw, 2.0f*qy*qz + 2.0f*qx*qw, 1.0f - 2.0f*qx*qx - 2.0f*qy*qy, 0.0f,
    0.0f, 0.0f, 0.0f, 1.0f);

В зависимости от класса матрицы вам, возможно, придется транспонировать ее перед передачей в OpenGL.

31
ответ дан 30 November 2019 в 11:18
поделиться

Один из способов сделать это, который довольно легко визуализировать, - это применить вращение, указанное вашим кватернионом, к базисным векторам (1,0,0), (0,1,0 ) и (0,0,1). Повернутые значения задают базисные векторы в повернутой системе относительно исходной системы. Используйте эти векторы для формирования строк матрицы вращения. Результирующая матрица и ее транспонирование, представляют собой прямые и обратные преобразования между исходной системой и ротационная система.

Я не знаком с соглашениями, используемыми в OpenGL, поэтому, возможно, кто-то другой сможет ответить эта часть вашего вопроса ...

9
ответ дан 30 November 2019 в 11:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: