diff --git a/src/Math/DualQuaternion.h b/src/Math/DualQuaternion.h index 1f060e9e5..2b132864c 100644 --- a/src/Math/DualQuaternion.h +++ b/src/Math/DualQuaternion.h @@ -84,6 +84,20 @@ template class DualQuaternion: public Dual> { */ inline constexpr /*implicit*/ DualQuaternion(const Quaternion& real, const Quaternion& dual): Dual>(real, dual) {} + /** + * @brief Construct dual quaternion from vector + * + * @f[ + * \hat q = [\boldsymbol 0, 1] + \epsilon [\boldsymbol v, 0] + * @f] + * @todoc Remove workaround when Doxygen is predictable + */ + #ifdef DOXYGEN_GENERATING_OUTPUT + inline constexpr explicit DualQuaternion(const Vector3& vector); + #else + inline constexpr explicit DualQuaternion(const Vector3& vector): Dual>({}, {vector, T(0)}) {} + #endif + /** * @brief Rotation angle of unit dual quaternion * diff --git a/src/Math/Test/DualQuaternionTest.cpp b/src/Math/Test/DualQuaternionTest.cpp index dfc41fcf9..8a653804d 100644 --- a/src/Math/Test/DualQuaternionTest.cpp +++ b/src/Math/Test/DualQuaternionTest.cpp @@ -27,6 +27,7 @@ class DualQuaternionTest: public Corrade::TestSuite::Tester { void construct(); void constructDefault(); + void constructFromVector(); void norm(); @@ -49,6 +50,7 @@ typedef Math::Vector3 Vector3; DualQuaternionTest::DualQuaternionTest() { addTests(&DualQuaternionTest::construct, &DualQuaternionTest::constructDefault, + &DualQuaternionTest::constructFromVector, &DualQuaternionTest::norm, @@ -73,6 +75,10 @@ void DualQuaternionTest::constructDefault() { CORRADE_COMPARE(DualQuaternion(), DualQuaternion({{0.0f, 0.0f, 0.0f}, 1.0f}, {{0.0f, 0.0f, 0.0f}, 0.0f})); } +void DualQuaternionTest::constructFromVector() { + CORRADE_COMPARE(DualQuaternion({1.0f, 2.0f, 3.0f}), DualQuaternion({{0.0f, 0.0f, 0.0f}, 1.0f}, {{1.0f, 2.0f, 3.0f}, 0.0f})); +} + void DualQuaternionTest::norm() { CORRADE_COMPARE(DualQuaternion().norm(), 1.0f);