diff --git a/include/vclib/space/quaternion.h b/include/vclib/space/quaternion.h index 25c9c1bc8..6c7f0bdeb 100644 --- a/include/vclib/space/quaternion.h +++ b/include/vclib/space/quaternion.h @@ -93,11 +93,14 @@ class Quaternion { } - Quaternion(const Eigen::Quaternion& qq) { q << qq; } + Quaternion(const Eigen::Quaternion& qq) : q(qq) {} Quaternion(const Matrix33& rotMatrix) : q(rotMatrix) {} - Quaternion(const Matrix44& rotMatrix) : q(rotMatrix) {} + Quaternion(const Matrix44& rotMatrix) : + q(Matrix33(rotMatrix.block(0, 0, 3, 3))) + { + } /** * @brief Constructs the quaternion that will represent the rotation between @@ -277,8 +280,16 @@ class Quaternion Point3 operator*(const Point3& p) { const Eigen::Matrix& v = p.eigenVector(); - return Point3( - v + 2.0 * q.vec().cross(q.vec().cross(v) + q.w() * v)); + + Eigen::Matrix fc = q.vec().cross(v); + + Eigen::Matrix fd = v * q.w(); + + Eigen::Matrix s = fc + fd; + + Eigen::Matrix sc = q.vec().cross(s); + + return Point3(v + sc * 2.0 ); } Quaternion& operator*=(const Quaternion& q2)