function fromMat3(out, m) {
      // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes
      // article "Quaternion Calculus and Fast Animation".
      var fTrace = m[0] + m[4] + m[8];
      var fRoot;

      if (fTrace > 0.0) {
        // |w| > 1/2, may as well choose w > 1/2
        fRoot = Math.sqrt(fTrace + 1.0); // 2w

        out[3] = 0.5 * fRoot;
        fRoot = 0.5 / fRoot; // 1/(4w)

        out[0] = (m[5] - m[7]) * fRoot;
        out[1] = (m[6] - m[2]) * fRoot;
        out[2] = (m[1] - m[3]) * fRoot;
      } else {
        // |w| <= 1/2
        var i = 0;
        if (m[4] > m[0]) i = 1;
        if (m[8] > m[i * 3 + i]) i = 2;
        var j = (i + 1) % 3;
        var k = (i + 2) % 3;
        fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);
        out[i] = 0.5 * fRoot;
        fRoot = 0.5 / fRoot;
        out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;
        out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;
        out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;
      }

      return out;
    }
/**
     * Creates a quaternion from the given 3x3 rotation matrix.
     *
     * NOTE: The resultant quaternion is not normalized, so you should be sure
     * to renormalize the quaternion yourself where necessary.
     *
     * @param {quat} out the receiving quaternion
     * @param {ReadonlyMat3} m rotation matrix
     * @returns {quat} out
     * @function
     */
Creates a quaternion from the given 3x3 rotation matrix.

The resultant quaternion is not normalized, so you should be sure
to renormalize the quaternion yourself where necessary.

@param {quat} out the receiving quaternion
@param {ReadonlyMat3} m rotation matrix
@returns {quat} out
@function
Creates a quaternion from the given 3x3 rotation matrix . The resultant quaternion is not normalized so you should be sure to renormalize the quaternion yourself where necessary . @param { quat } out the receiving quaternion @param { ReadonlyMat3 } m rotation matrix @returns { quat } out @function
function fromMat3(out, m) {
      var fTrace = m[0] + m[4] + m[8];
      var fRoot;
      if (fTrace > 0.0) {
        fRoot = Math.sqrt(fTrace + 1.0); 
        out[3] = 0.5 * fRoot;
        fRoot = 0.5 / fRoot; 
        out[0] = (m[5] - m[7]) * fRoot;
        out[1] = (m[6] - m[2]) * fRoot;
        out[2] = (m[1] - m[3]) * fRoot;
      } else {
        var i = 0;
        if (m[4] > m[0]) i = 1;
        if (m[8] > m[i * 3 + i]) i = 2;
        var j = (i + 1) % 3;
        var k = (i + 2) % 3;
        fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);
        out[i] = 0.5 * fRoot;
        fRoot = 0.5 / fRoot;
        out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;
        out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;
        out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;
      }
      return out;
    }
function fromMat3 ( out , m ) { var fTrace = m [ 0 ] + m [ 4 ] + m [ 8 ] ; var fRoot ; if ( fTrace > 0.0 ) { fRoot = Math . sqrt ( fTrace + 1.0 ) ; out [ 3 ] = 0.5 * fRoot ; fRoot = 0.5 / fRoot ; out [ 0 ] = ( m [ 5 ] - m [ 7 ] ) * fRoot ; out [ 1 ] = ( m [ 6 ] - m [ 2 ] ) * fRoot ; out [ 2 ] = ( m [ 1 ] - m [ 3 ] ) * fRoot ; } else { var i = 0 ; if ( m [ 4 ] > m [ 0 ] ) i = 1 ; if ( m [ 8 ] > m [ i * 3 + i ] ) i = 2 ; var j = ( i + 1 ) % 3 ; var k = ( i + 2 ) % 3 ; fRoot = Math . sqrt ( m [ i * 3 + i ] - m [ j * 3 + j ] - m [ k * 3 + k ] + 1.0 ) ; out [ i ] = 0.5 * fRoot ; fRoot = 0.5 / fRoot ; out [ 3 ] = ( m [ j * 3 + k ] - m [ k * 3 + j ] ) * fRoot ; out [ j ] = ( m [ j * 3 + i ] + m [ i * 3 + j ] ) * fRoot ; out [ k ] = ( m [ k * 3 + i ] + m [ i * 3 + k ] ) * fRoot ; } return out ; }
Creates a quaternion from the given 3x3 rotation matrix.
Creates a quaternion from the given 3x3 rotation matrix .
// Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes // article "Quaternion Calculus and Fast Animation". // |w| > 1/2, may as well choose w > 1/2 // 2w // 1/(4w) // |w| <= 1/2