Browse Source

Merge branch 'master' into compatibility

Vladimír Vondruš 11 years ago
parent
commit
ee69aa231c
  1. 5
      src/Magnum/Math/Quaternion.h
  2. 21
      src/Magnum/Math/Test/QuaternionTest.cpp

5
src/Magnum/Math/Quaternion.h

@ -543,7 +543,10 @@ template<class T> Quaternion<T> quaternionFromMatrix(const Matrix<3, T>& m) {
}
/* Diagonal is negative */
const std::size_t i = diagonal.max();
std::size_t i = 0;
if(diagonal[1] > diagonal[0]) i = 1;
if(diagonal[2] > diagonal[i]) i = 2;
const std::size_t j = (i + 1) % 3;
const std::size_t k = (i + 2) % 3;

21
src/Magnum/Math/Test/QuaternionTest.cpp

@ -278,7 +278,7 @@ void QuaternionTest::angle() {
}
void QuaternionTest::matrix() {
Vector3 axis = Vector3(1.0f, -3.0f, 5.0f).normalized();
Vector3 axis = Vector3(-3.0f, 1.0f, 5.0f).normalized();
Quaternion q = Quaternion::rotation(Deg(37.0f), axis);
Matrix3x3 m = Matrix4::rotation(Deg(37.0f), axis).rotationScaling();
@ -296,11 +296,28 @@ void QuaternionTest::matrix() {
CORRADE_VERIFY(m.trace() > 0.0f);
CORRADE_COMPARE(Quaternion::fromMatrix(m), q);
/* Trace < 0 */
/* Trace < 0, max is diagonal[2] */
Matrix3x3 m2 = Matrix4::rotation(Deg(130.0f), axis).rotationScaling();
Quaternion q2 = Quaternion::rotation(Deg(130.0f), axis);
CORRADE_VERIFY(m2.trace() < 0.0f);
CORRADE_VERIFY(m2.diagonal()[2] > std::max(m2.diagonal()[0], m2.diagonal()[1]));
CORRADE_COMPARE(Quaternion::fromMatrix(m2), q2);
/* Trace < 0, max is diagonal[1] */
Vector3 axis2 = Vector3(-3.0f, 5.0f, 1.0f).normalized();
Matrix3x3 m3 = Matrix4::rotation(Deg(130.0f), axis2).rotationScaling();
Quaternion q3 = Quaternion::rotation(Deg(130.0f), axis2);
CORRADE_VERIFY(m3.trace() < 0.0f);
CORRADE_VERIFY(m3.diagonal()[1] > std::max(m3.diagonal()[0], m3.diagonal()[2]));
CORRADE_COMPARE(Quaternion::fromMatrix(m3), q3);
/* Trace < 0, max is diagonal[0] */
Vector3 axis3 = Vector3(5.0f, -3.0f, 1.0f).normalized();
Matrix3x3 m4 = Matrix4::rotation(Deg(130.0f), axis3).rotationScaling();
Quaternion q4 = Quaternion::rotation(Deg(130.0f), axis3);
CORRADE_VERIFY(m4.trace() < 0.0f);
CORRADE_VERIFY(m4.diagonal()[0] > std::max(m4.diagonal()[1], m4.diagonal()[2]));
CORRADE_COMPARE(Quaternion::fromMatrix(m4), q4);
}
void QuaternionTest::lerp() {

Loading…
Cancel
Save