in src/math/Quaternion.ts [117:147]
static FromMatrix3(matrix: Matrix3): Quaternion {
const m = matrix.buffer;
const trace = m[0] + m[4] + m[8];
let x, y, z, w;
if (trace > 0) {
const s = 0.5 / Math.sqrt(trace + 1.0);
w = 0.25 / s;
x = (m[7] - m[5]) * s;
y = (m[2] - m[6]) * s;
z = (m[3] - m[1]) * s;
} else if (m[0] > m[4] && m[0] > m[8]) {
const s = 2.0 * Math.sqrt(1.0 + m[0] - m[4] - m[8]);
w = (m[7] - m[5]) / s;
x = 0.25 * s;
y = (m[1] + m[3]) / s;
z = (m[2] + m[6]) / s;
} else if (m[4] > m[8]) {
const s = 2.0 * Math.sqrt(1.0 + m[4] - m[0] - m[8]);
w = (m[2] - m[6]) / s;
x = (m[1] + m[3]) / s;
y = 0.25 * s;
z = (m[5] + m[7]) / s;
} else {
const s = 2.0 * Math.sqrt(1.0 + m[8] - m[0] - m[4]);
w = (m[3] - m[1]) / s;
x = (m[2] + m[6]) / s;
y = (m[5] + m[7]) / s;
z = 0.25 * s;
}
return new Quaternion(x, y, z, w);
}