aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2015-12-01 09:45:56 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2015-12-01 09:45:56 +0100
commit6c02cbbb0f1786f5f22285342850250c28845272 (patch)
tree92aa4c612cd3dd123ff5f4d75b95a2d10e7dd3bd
parent844561939f931643df7d6e2387288bb0fe7b600f (diff)
Fix matrix to quaternion (and angleaxis) conversion for matrix expression.
-rw-r--r--Eigen/src/Geometry/Quaternion.h3
-rw-r--r--test/geo_quaternion.cpp6
2 files changed, 8 insertions, 1 deletions
diff --git a/Eigen/src/Geometry/Quaternion.h b/Eigen/src/Geometry/Quaternion.h
index 56fa2bfbf..32e7e76fa 100644
--- a/Eigen/src/Geometry/Quaternion.h
+++ b/Eigen/src/Geometry/Quaternion.h
@@ -739,8 +739,9 @@ template<typename Other>
struct quaternionbase_assign_impl<Other,3,3>
{
typedef typename Other::Scalar Scalar;
- template<class Derived> static inline void run(QuaternionBase<Derived>& q, const Other& mat)
+ template<class Derived> static inline void run(QuaternionBase<Derived>& q, const Other& a_mat)
{
+ const typename internal::nested_eval<Other,2>::type mat(a_mat);
using std::sqrt;
// This algorithm comes from "Quaternion Calculus and Fast Animation",
// Ken Shoemake, 1987 SIGGRAPH course notes
diff --git a/test/geo_quaternion.cpp b/test/geo_quaternion.cpp
index 17229be4a..761bb52b4 100644
--- a/test/geo_quaternion.cpp
+++ b/test/geo_quaternion.cpp
@@ -49,6 +49,7 @@ template<typename Scalar, int Options> void quaternion(void)
*/
using std::abs;
typedef Matrix<Scalar,3,1> Vector3;
+ typedef Matrix<Scalar,3,3> Matrix3;
typedef Matrix<Scalar,4,1> Vector4;
typedef Quaternion<Scalar,Options> Quaternionx;
typedef AngleAxis<Scalar> AngleAxisx;
@@ -101,6 +102,11 @@ template<typename Scalar, int Options> void quaternion(void)
q2 = q1.toRotationMatrix();
VERIFY_IS_APPROX(q1*v1,q2*v1);
+ Matrix3 rot1(q1);
+ VERIFY_IS_APPROX(q1*v1,rot1*v1);
+ Quaternionx q3(rot1.transpose()*rot1);
+ VERIFY_IS_APPROX(q3*v1,v1);
+
// angle-axis conversion
AngleAxisx aa = AngleAxisx(q1);