public static void TransformZ(float z, ref Quaternion rotation, out Vector3 result)
{
//This operation is an optimized-down version of v' = q * v * q^-1.
//The expanded form would be to treat v as an 'axis only' quaternion
//and perform standard quaternion multiplication. Assuming q is normalized,
//q^-1 can be replaced by a conjugation.
float x2 = rotation.X + rotation.X;
float y2 = rotation.Y + rotation.Y;
float z2 = rotation.Z + rotation.Z;
float xx2 = rotation.X * x2;
float xz2 = rotation.X * z2;
float yy2 = rotation.Y * y2;
float yz2 = rotation.Y * z2;
float wx2 = rotation.W * x2;
float wy2 = rotation.W * y2;
//Defer the component setting since they're used in computation.
float transformedX = z * (xz2 + wy2);
float transformedY = z * (yz2 - wx2);
float transformedZ = z * (1f - xx2 - yy2);
result.X = transformedX;
result.Y = transformedY;
result.Z = transformedZ;
}