Browse Source

Math: converting Quaternion to rotation matrix.

pull/7/head
Vladimír Vondruš 14 years ago
parent
commit
8e93520bd6
  1. 20
      src/Math/Quaternion.h
  2. 11
      src/Math/Test/MathQuaternionTest.cpp

20
src/Math/Quaternion.h

@ -25,6 +25,7 @@
#include "Math/Math.h"
#include "Math/MathTypeTraits.h"
#include "Math/Matrix.h"
#include "Math/Vector3.h"
namespace Magnum { namespace Math {
@ -92,6 +93,25 @@ template<class T> class Quaternion {
return _vector/std::sqrt(1-pow<2>(_scalar));
}
/**
* @brief Convert quaternion to rotation matrix
*
* @see Matrix4::from(const Matrix<3, T>&, const Vector3<T>&)
*/
Matrix<3, T> matrix() const {
return { /* Column-major! */
T(1) - 2*pow<2>(_vector.y()) - 2*pow<2>(_vector.z()),
2*_vector.x()*_vector.y() + 2*_vector.z()*_scalar,
2*_vector.x()*_vector.z() - 2*_vector.y()*_scalar,
2*_vector.x()*_vector.y() - 2*_vector.z()*_scalar,
T(1) - 2*pow<2>(_vector.x()) - 2*pow<2>(_vector.z()),
2*_vector.y()*_vector.z() + 2*_vector.x()*_scalar,
2*_vector.x()*_vector.z() + 2*_vector.y()*_scalar,
2*_vector.y()*_vector.z() - 2*_vector.x()*_scalar,
T(1) - 2*pow<2>(_vector.x()) - 2*pow<2>(_vector.y())
};
}
/**
* @brief Multiply with scalar and assign
*

11
src/Math/Test/MathQuaternionTest.cpp

@ -17,6 +17,7 @@
#include <TestSuite/Tester.h>
#include "Math/Constants.h"
#include "Math/Matrix4.h"
#include "Math/Quaternion.h"
namespace Magnum { namespace Math { namespace Test {
@ -34,6 +35,7 @@ class QuaternionTest: public Corrade::TestSuite::Tester {
void inverted();
void invertedNormalized();
void rotation();
void matrix();
void debug();
};
@ -51,6 +53,7 @@ QuaternionTest::QuaternionTest() {
&QuaternionTest::inverted,
&QuaternionTest::invertedNormalized,
&QuaternionTest::rotation,
&QuaternionTest::matrix,
&QuaternionTest::debug);
}
@ -132,6 +135,14 @@ void QuaternionTest::rotation() {
CORRADE_COMPARE(q2.rotationAxis(), -axis);
}
void QuaternionTest::matrix() {
float angle = deg(37.0f);
Vector3 axis(1.0f/Constants<float>::sqrt3());
Quaternion q = Quaternion::fromRotation(angle, axis);
Matrix<3, float> expected = Matrix4<float>::rotation(angle, axis).rotationScaling();
CORRADE_COMPARE(q.matrix(), expected);
}
void QuaternionTest::debug() {
std::ostringstream o;

Loading…
Cancel
Save