diff --git a/Eigen/Geometry b/Eigen/Geometry index 8698dd1a5..9cae3459c 100644 --- a/Eigen/Geometry +++ b/Eigen/Geometry @@ -6,7 +6,7 @@ #include "src/Core/util/DisableMSVCWarnings.h" #include "Array" -#include "QR" +#include "SVD" #include #ifndef M_PI diff --git a/Eigen/src/Geometry/Quaternion.h b/Eigen/src/Geometry/Quaternion.h index 088dff9f2..a76ccbdaf 100644 --- a/Eigen/src/Geometry/Quaternion.h +++ b/Eigen/src/Geometry/Quaternion.h @@ -367,12 +367,14 @@ inline Quaternion& Quaternion::setFromTwoVectors(const MatrixBas // x^T v1 = 0 // under the constraint: // ||x|| = 1 - // which yields an eigenvalue problem (or a SVD) + // which yields a singular value problem if (ei_isApprox(c,Scalar(-1))) { c = std::max(c,-1); - SelfAdjointEigenSolver > eig(v0 * v0.transpose() + v1 * v1.transpose()); - Vector3 axis = eig.eigenvectors().col(0); + + SVD > svd(v0 * v0.transpose() + v1 * v1.transpose()); + Vector3 axis = svd.matrixV().col(2); + Scalar w2 = (Scalar(1)+c)*Scalar(0.5); this->w() = ei_sqrt(w2); this->vec() = axis * ei_sqrt(Scalar(1) - w2);