   scale in quaternion
  Why not using scaled quaternion ? Why unit ?The conversion from scaled to matrix is a very effective ? and can give a scaled matrix and unit. And operations with scaled quaternion ( multiplication ) still represent rotation (q1*s)*q2 = q3*s = (q1*q2)*s; The rotation of vector with scaled quat give  a vector rotated and scaled by norm of quaternion.void RotationFromNonUnitQuatToMatrix( const quaternion& q, matrix33& m  ){  float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;   float s  = 2.0f/q.norm();  // no sqrt , just 4 mul 3 add 1 div   x2 = q.x * s;   y2 = q.y * s;   z2 = q.z * s;   xx = q.x * x2;   xy = q.x * y2;   xz = q.x * z2;   yy = q.y * y2;   yz = q.y * z2;   zz = q.z * z2;   wx = q.w * x2;   wy = q.w * y2;   wz = q.w * z2;   m[0][0] = 1.0f - (yy + zz);   m[1][0] = xy - wz;   m[2][0] = xz + wy;   m[0][1] = xy + wz;   m[1][1] = 1.0f - (xx + zz);   m[2][1] = yz - wx;   m[0][2] = xz - wy;   m[1][2] = yz + wx;   m[2][2] = 1.0f - (xx + yy);}//------------------------------------------------------------------void RotationScaleFromQuatToMatrix( const quaternion& q, matrix33& m  ){  float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;   float n  = q.norm();  // , just 4 mul 3 add    x2 = q.x + q.x;   y2 = q.y + q.x;   z2 = q.z + q.x;   xx = q.x * x2;   xy = q.x * y2;   xz = q.x * z2;   yy = q.y * y2;   yz = q.y * z2;   zz = q.z * z2;   wx = q.w * x2;   wy = q.w * y2;   wz = q.w * z2;   m[0][0] = n - (yy + zz);   m[1][0] = xy - wz;   m[2][0] = xz + wy;   m[0][1] = xy + wz;   m[1][1] = n - (xx + zz);   m[2][1] = yz - wx;   m[0][2] = xz - wy;   m[1][2] = yz + wx;   m[2][2] = n - (xx + yy);}//------------------------------------------------------------------We can create the nonunit quaternions more effective than the unit.The example : We can Lerp the quaternions and get the matrix in result without any sqrt functions 