void Basis::get_rotation_axis_angle_local(Vector3 &p_axis, real_t &p_angle) const { // Assumes that the matrix can be decomposed into a proper rotation and scaling matrix as M = R.S, // and returns the Euler angles corresponding to the rotation part, complementing get_scale(). // See the comment in get_scale() for further information. Basis m = transposed(); m.orthonormalize(); real_t det = m.determinant(); if (det < 0) { // Ensure that the determinant is 1, such that result is a proper rotation matrix which can be represented by Euler angles. m.scale(Vector3(-1, -1, -1)); } m.get_axis_angle(p_axis, p_angle); p_angle = -p_angle; }
Basis Basis::orthonormalized() const { Basis c = *this; c.orthonormalize(); return c; }