UnitQuaternion UnitQuaternion::operator * (const UnitQuaternion& p) const { //From http://en.wikipedia.org/wiki/Quaternion#Quaternions_and_the_geometry_of_R3 double realPart = real() * p.real() - arma::dot(imaginary(), p.imaginary()); arma::vec3 imaginaryPart = arma::cross(imaginary(), p.imaginary()) + p.real() * imaginary() + real() * p.imaginary(); return UnitQuaternion(realPart, imaginaryPart); }