BLI_math: add utility to calculate compatible quaternions

This commit is contained in:
Campbell Barton
2019-03-19 16:50:18 +11:00
parent e7fd6c8f30
commit e2ec045cc9
2 changed files with 19 additions and 0 deletions

View File

@@ -77,6 +77,8 @@ void add_qt_qtqt(float q[4], const float a[4], const float b[4], const float t);
void quat_to_mat3(float mat[3][3], const float q[4]);
void quat_to_mat4(float mat[4][4], const float q[4]);
void quat_to_compatible_quat(float q[4], const float a[4], const float old[4]);
void mat3_normalized_to_quat(float q[4], const float mat[3][3]);
void mat4_normalized_to_quat(float q[4], const float mat[4][4]);
void mat3_to_quat(float q[4], const float mat[3][3]);

View File

@@ -201,6 +201,23 @@ void pow_qt_fl_normalized(float q[4], const float fac)
normalize_v3_length(q + 1, si);
}
/**
* Apply the rotation of \a a to \a q keeping the values compatible with \a old.
* Avoid axis flipping for animated f-curves for eg.
*/
void quat_to_compatible_quat(float q[4], const float a[4], const float old[4])
{
BLI_ASSERT_UNIT_QUAT(a);
float delta[4];
float old_unit[4];
normalize_qt_qt(old_unit, old);
rotation_between_quats_to_quat(delta, old_unit, a);
mul_qt_qtqt(q, old, delta);
if ((q[0] < 0.0f) != (old[0] < 0.0f)) {
negate_v4(q);
}
}
/* skip error check, currently only needed by mat3_to_quat_is_ok */
static void quat_to_mat3_no_error(float m[3][3], const float q[4])
{