Browse Source

Math: converting DualQuaternion to matrix.

Also updated and simplified Quaternion to matrix test.
pull/7/head
Vladimír Vondruš 13 years ago
parent
commit
83346ce023
  1. 10
      src/Math/DualQuaternion.h
  2. 2
      src/Math/Quaternion.h
  3. 12
      src/Math/Test/DualQuaternionTest.cpp
  4. 10
      src/Math/Test/QuaternionTest.cpp

10
src/Math/DualQuaternion.h

@ -20,6 +20,7 @@
*/ */
#include "Math/Dual.h" #include "Math/Dual.h"
#include "Math/Matrix4.h"
#include "Math/Quaternion.h" #include "Math/Quaternion.h"
namespace Magnum { namespace Math { namespace Magnum { namespace Math {
@ -137,6 +138,15 @@ template<class T> class DualQuaternion: public Dual<Quaternion<T>> {
return (this->dual()*this->real().conjugated()).vector()*T(2); return (this->dual()*this->real().conjugated()).vector()*T(2);
} }
/**
* @brief Convert dual quaternion to transformation matrix
*
* @see Quaternion::matrix()
*/
Matrix4<T> matrix() const {
return Matrix4<T>::from(this->real().matrix(), translation());
}
/** /**
* @brief Quaternion-conjugated dual quaternion * @brief Quaternion-conjugated dual quaternion
* *

2
src/Math/Quaternion.h

@ -200,7 +200,7 @@ template<class T> class Quaternion {
/** /**
* @brief Convert quaternion to rotation matrix * @brief Convert quaternion to rotation matrix
* *
* @see Matrix4::from(const Matrix<3, T>&, const Vector3<T>&) * @see DualQuaternion::matrix(), Matrix4::from(const Matrix<3, T>&, const Vector3<T>&)
*/ */
Matrix<3, T> matrix() const { Matrix<3, T> matrix() const {
return { return {

12
src/Math/Test/DualQuaternionTest.cpp

@ -18,7 +18,6 @@
#include "Math/Constants.h" #include "Math/Constants.h"
#include "Math/DualQuaternion.h" #include "Math/DualQuaternion.h"
#include "Math/Matrix4.h"
namespace Magnum { namespace Math { namespace Test { namespace Magnum { namespace Math { namespace Test {
@ -40,6 +39,7 @@ class DualQuaternionTest: public Corrade::TestSuite::Tester {
void rotation(); void rotation();
void translation(); void translation();
void combinedTransformParts(); void combinedTransformParts();
void matrix();
void transformPointNormalized(); void transformPointNormalized();
void debug(); void debug();
@ -67,6 +67,7 @@ DualQuaternionTest::DualQuaternionTest() {
&DualQuaternionTest::rotation, &DualQuaternionTest::rotation,
&DualQuaternionTest::translation, &DualQuaternionTest::translation,
&DualQuaternionTest::combinedTransformParts, &DualQuaternionTest::combinedTransformParts,
&DualQuaternionTest::matrix,
&DualQuaternionTest::transformPointNormalized, &DualQuaternionTest::transformPointNormalized,
&DualQuaternionTest::debug); &DualQuaternionTest::debug);
@ -159,6 +160,15 @@ void DualQuaternionTest::combinedTransformParts() {
CORRADE_COMPARE(b.translation(), Quaternion::rotation(deg(23.0f), Vector3::xAxis()).rotateVectorNormalized(translation)); CORRADE_COMPARE(b.translation(), Quaternion::rotation(deg(23.0f), Vector3::xAxis()).rotateVectorNormalized(translation));
} }
void DualQuaternionTest::matrix() {
DualQuaternion q = DualQuaternion::rotation(deg(23.0f), Vector3::xAxis())*DualQuaternion::translation({-1.0f, 2.0f, 3.0f});
Matrix4 m = Matrix4::rotationX(deg(23.0f))*Matrix4::translation({-1.0f, 2.0f, 3.0f});
/* Verify that negated dual quaternion gives the same transformation */
CORRADE_COMPARE(q.matrix(), m);
CORRADE_COMPARE((-q).matrix(), m);
}
void DualQuaternionTest::transformPointNormalized() { void DualQuaternionTest::transformPointNormalized() {
DualQuaternion a = DualQuaternion::translation({-1.0f, 2.0f, 3.0f})*DualQuaternion::rotation(deg(23.0f), Vector3::xAxis()); DualQuaternion a = DualQuaternion::translation({-1.0f, 2.0f, 3.0f})*DualQuaternion::rotation(deg(23.0f), Vector3::xAxis());
DualQuaternion b = DualQuaternion::rotation(deg(23.0f), Vector3::xAxis())*DualQuaternion::translation({-1.0f, 2.0f, 3.0f}); DualQuaternion b = DualQuaternion::rotation(deg(23.0f), Vector3::xAxis())*DualQuaternion::translation({-1.0f, 2.0f, 3.0f});

10
src/Math/Test/QuaternionTest.cpp

@ -239,14 +239,12 @@ void QuaternionTest::angle() {
} }
void QuaternionTest::matrix() { void QuaternionTest::matrix() {
float angle = deg(37.0f); Quaternion q = Quaternion::rotation(deg(37.0f), Vector3(1.0f/Constants<float>::sqrt3()));
Vector3 axis(1.0f/Constants<float>::sqrt3()); Matrix3 m = Matrix4::rotation(deg(37.0f), Vector3(1.0f/Constants<float>::sqrt3())).rotationScaling();
Quaternion q = Quaternion::rotation(angle, axis);
Matrix3 expected = Matrix4::rotation(angle, axis).rotationScaling();
CORRADE_COMPARE(q.matrix(), expected);
/* Verify that negated quaternion gives the same rotation */ /* Verify that negated quaternion gives the same rotation */
CORRADE_COMPARE((-q).matrix(), expected); CORRADE_COMPARE(q.matrix(), m);
CORRADE_COMPARE((-q).matrix(), m);
} }
void QuaternionTest::lerp() { void QuaternionTest::lerp() {

Loading…
Cancel
Save