fromMatrix3 method
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;
}