setFromRotationMatrix method

Quaternion setFromRotationMatrix(
  1. dynamic m
)

Implementation

Quaternion setFromRotationMatrix(m) {
  // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm

  // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)

  final te = m.storage;
  double m11 = te[0];
  double m12 = te[4];
  double m13 = te[8];
  double m21 = te[1];
  double m22 = te[5];
  double m23 = te[9];
  double m31 = te[2];
  double m32 = te[6];
  double m33 = te[10];
  double trace = m11 + m22 + m33;

  if (trace > 0) {
    final 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) {
    final 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) {
    final 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 {
    final 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;
  }

  onChangeCallback();

  return this;
}