Skip to content

Instantly share code, notes, and snippets.

@gocarlos
Created February 28, 2017 15:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gocarlos/5cf5a055911821d981b1532b300d75d0 to your computer and use it in GitHub Desktop.
Save gocarlos/5cf5a055911821d981b1532b300d75d0 to your computer and use it in GitHub Desktop.
Calculate the quaternion formed by two direction vectors
Eigen::Quaternionf Common::GetQuaternionFromDirVectors(
const Eigen::Vector3f& upwards, const Eigen::Vector3f& forwards) {
Eigen::Vector3f right = forwards.cross(upwards);
#define m00 right.x()
#define m01 forwards.x()
#define m02 upwards.x()
#define m10 right.y()
#define m11 forwards.y()
#define m12 upwards.y()
#define m20 right.z()
#define m21 forwards.z()
#define m22 upwards.z()
Eigen::Quaternionf ret;
ret.w() = std::sqrt(1.0f + m00 + m11 + m22) * 0.5f;
float w4_recip = 1.0f / (4.0f * ret.w());
ret.x() = (m21 - m12) * w4_recip;
ret.y() = (m02 - m20) * w4_recip;
ret.z() = (m10 - m01) * w4_recip;
#undef m00
#undef m01
#undef m02
#undef m10
#undef m11
#undef m12
#undef m20
#undef m21
#undef m22
ret.normalize();
return ret;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment