// static Matrix4f Matrix4f::rotation( const Quat4f& q ) { Quat4f qq = q.normalized(); float xx = qq.x() * qq.x(); float yy = qq.y() * qq.y(); float zz = qq.z() * qq.z(); float xy = qq.x() * qq.y(); float zw = qq.z() * qq.w(); float xz = qq.x() * qq.z(); float yw = qq.y() * qq.w(); float yz = qq.y() * qq.z(); float xw = qq.x() * qq.w(); return Matrix4f ( 1.0f - 2.0f * ( yy + zz ), 2.0f * ( xy - zw ), 2.0f * ( xz + yw ), 0.0f, 2.0f * ( xy + zw ), 1.0f - 2.0f * ( xx + zz ), 2.0f * ( yz - xw ), 0.0f, 2.0f * ( xz - yw ), 2.0f * ( yz + xw ), 1.0f - 2.0f * ( xx + yy ), 0.0f, 0.0f, 0.0f, 0.0f, 1.0f ); }
// static Matrix3f Matrix3f::rotation( const Quat4f& rq ) { Quat4f q = rq.normalized(); float xx = q.x() * q.x(); float yy = q.y() * q.y(); float zz = q.z() * q.z(); float xy = q.x() * q.y(); float zw = q.z() * q.w(); float xz = q.x() * q.z(); float yw = q.y() * q.w(); float yz = q.y() * q.z(); float xw = q.x() * q.w(); return Matrix3f ( 1.0f - 2.0f * ( yy + zz ), 2.0f * ( xy - zw ), 2.0f * ( xz + yw ), 2.0f * ( xy + zw ), 1.0f - 2.0f * ( xx + zz ), 2.0f * ( yz - xw ), 2.0f * ( xz - yw ), 2.0f * ( yz + xw ), 1.0f - 2.0f * ( xx + yy ) ); }