fromMatrix3 method

Quaternion fromMatrix3(
  1. Matrix3 m
)

Sets the components of this quaternion from the given 3x3 rotation matrix.

Implementation

Quaternion fromMatrix3(Matrix3 m ) {
	final e = m.elements;

	final m11 = e[ 0 ], m12 = e[ 3 ], m13 = e[ 6 ];
	final m21 = e[ 1 ], m22 = e[ 4 ], m23 = e[ 7 ];
	final m31 = e[ 2 ], m32 = e[ 5 ], m33 = e[ 8 ];

	final trace = m11 + m22 + m33;

	if ( trace > 0 ) {
		double s = 0.5 / math.sqrt( trace + 1.0 );

		w = 0.25 / s;
		x = ( m32 - m23 ) * s;
		y = ( m13 - m31 ) * s;
		z = ( m21 - m12 ) * s;
	}
    else if ( ( m11 > m22 ) && ( m11 > m33 ) ) {
		double s = 2.0 * math.sqrt( 1.0 + m11 - m22 - m33 );

		w = ( m32 - m23 ) / s;
		x = 0.25 * s;
		y = ( m12 + m21 ) / s;
		z = ( m13 + m31 ) / s;
	}
    else if ( m22 > m33 ) {
		double s = 2.0 * math.sqrt( 1.0 + m22 - m11 - m33 );

		w = ( m13 - m31 ) / s;
		x = ( m12 + m21 ) / s;
		y = 0.25 * s;
		z = ( m23 + m32 ) / s;
	}
    else {
		double s = 2.0 * math.sqrt( 1.0 + m33 - m11 - m22 );

		w = ( m21 - m12 ) / s;
		x = ( m13 + m31 ) / s;
		y = ( m23 + m32 ) / s;
		z = 0.25 * s;
	}

	return this;
}