void quaternion_t::compute_rotation(const vector_t& v1, const vector_t& v2) { PRX_ASSERT(v1.get_dim() == v2.get_dim()); vector_t v(3); double w; v.cross_product(v1,v2); w = sqrt(v1.squared_norm() * v2.squared_norm()) + v1.dot_product(v2); set(v[0],v[1],v[2],w); normalize(); }
void quaternion_t::compute_rotation(const vector_t& v1, const vector_t& v2) { PRX_ASSERT(v1.get_dim() == v2.get_dim()); vector_t v(3); double w; // v.cross_product(v1,v2); // // if ( fabs(v1.norm()-1) <= PRX_ZERO_CHECK && fabs(v2.norm()-1) <= PRX_ZERO_CHECK ) { // w = 1 + v1.dot_product(v2); // } else { // w = sqrt(v1.squared_norm() * v2.squared_norm()) + v1.dot_product(v2); // } // // set(v[0],v[1],v[2],w); v.cross_product(v1,v2); w = sqrt(v1.squared_norm() * v2.squared_norm()) + v1.dot_product(v2); set(v[0],v[1],v[2],w); // PRX_DEBUG_S("q: " << *this); normalize(); // PRX_DEBUG_S("AFTER q: " << *this); }