title: Quaternion to Euler angles algorithm - How to convert to 'Y = Up' and between handedness?
body: <p>I have an algorithm for converting between a Quaternion and Euler angles.</p>
  
  <pre><code>    public static Vector3 ToEulerAngles(this Quaternion q)
      {
          // Store the Euler angles in radians
          Vector3 pitchYawRoll = new Vector3();
  
          double sqw = q.W * q.W;
          double sqx = q.X * q.X;
          double sqy = q.Y * q.Y;
          double sqz = q.Z * q.Z;
  
          // If quaternion is normalised the unit is one, otherwise it is the correction factor
          double unit = sqx + sqy + sqz + sqw;
          double test = q.X * q.Y + q.Z * q.W;
  
          if (test &gt; 0.4999f * unit)                              // 0.4999f OR 0.5f - EPSILON
          {
              // Singularity at north pole
              pitchYawRoll.Y = 2f * (float)Math.Atan2(q.X, q.W);  // Yaw
              pitchYawRoll.X = PI * 0.5f;                         // Pitch
              pitchYawRoll.Z = 0f;                                // Roll
              return pitchYawRoll;
          }
          else if (test &lt; -0.4999f * unit)                        // -0.4999f OR -0.5f + EPSILON
          {
              // Singularity at south pole
              pitchYawRoll.Y = -2f * (float)Math.Atan2(q.X, q.W); // Yaw
              pitchYawRoll.X = -PI * 0.5f;                        // Pitch
              pitchYawRoll.Z = 0f;                                // Roll
              return pitchYawRoll;
          }
          else
          {
              pitchYawRoll.Y = (float)Math.Atan2(2f * q.Y * q.W - 2f * q.X * q.Z, sqx - sqy - sqz + sqw);       // Yaw
              pitchYawRoll.X = (float)Math.Asin(2f * test / unit);                                             // Pitch
              pitchYawRoll.Z = (float)Math.Atan2(2f * q.X * q.W - 2f * q.Y * q.Z, -sqx + sqy - sqz + sqw);      // Roll
          }
  
          return pitchYawRoll;
      }
  </code></pre>
  
  <p>This method only works for a right-handed Cartesian coordinate system with the Z axis pointing up.</p>
  
  <p>What would I change in order to make the Y axis point up instead of Z? (Would swapping X and Z work?)</p>
  
  <p>How can I accommodate left handed coordinate systems?</p>
  
  <p>EDIT:</p>
  
  <pre><code>public static Quaternion CreateFromYawPitchRoll(float yaw, float pitch, float roll)
  {
  float num = roll * 0.5f;
  float num2 = (float)Math.Sin((double)num);
  float num3 = (float)Math.Cos((double)num);
  float num4 = pitch * 0.5f;
  float num5 = (float)Math.Sin((double)num4);
  float num6 = (float)Math.Cos((double)num4);
  float num7 = yaw * 0.5f;
  float num8 = (float)Math.Sin((double)num7);
  float num9 = (float)Math.Cos((double)num7);
  Quaternion result;
  result.X = num9 * num5 * num3 + num8 * num6 * num2;
  result.Y = num8 * num6 * num3 - num9 * num5 * num2;
  result.Z = num9 * num6 * num2 - num8 * num5 * num3;
  result.W = num9 * num6 * num3 + num8 * num5 * num2;
  return result;
  }
  </code></pre>