public static void TransformX(float x, 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 y2 = rotation.Y + rotation.Y;
float z2 = rotation.Z + rotation.Z;
float xy2 = rotation.X * y2;
float xz2 = rotation.X * z2;
float yy2 = rotation.Y * y2;
float zz2 = rotation.Z * z2;
float wy2 = rotation.W * y2;
float wz2 = rotation.W * z2;
//Defer the component setting since they're used in computation.
float transformedX = x * (1f - yy2 - zz2);
float transformedY = x * (xy2 + wz2);
float transformedZ = x * (xz2 - wy2);
result.X = transformedX;
result.Y = transformedY;
result.Z = transformedZ;
}