diff --git a/doc/classes/JacobianIK3D.xml b/doc/classes/JacobianIK3D.xml index 6bbece2de1a..d78cc3a5974 100644 --- a/doc/classes/JacobianIK3D.xml +++ b/doc/classes/JacobianIK3D.xml @@ -1,7 +1,7 @@ - Pseudo inverse Jacobian matrix based inverse kinematics solver. + Jacobian transpose based inverse kinematics solver. [JacobianIK3D] calculates rotations for all joints simultaneously, producing natural and smooth movement. It is particularly suited for biological animations. diff --git a/scene/3d/jacobian_ik_3d.cpp b/scene/3d/jacobian_ik_3d.cpp index a6dbdfad8c0..c5a29a78ae5 100644 --- a/scene/3d/jacobian_ik_3d.cpp +++ b/scene/3d/jacobian_ik_3d.cpp @@ -54,7 +54,7 @@ void JacobianIK3D::_solve_iteration(double p_delta, Skeleton3D *p_skeleton, Iter continue; } - Quaternion to_rot = Quaternion(axis.normalized(), axis.length() / MAX(CMP_EPSILON, head_to_effector.length())); + Quaternion to_rot = Quaternion(axis.normalized(), MIN(axis.length() / MAX(CMP_EPSILON, head_to_effector.length_squared()), angular_delta_limit)); // Clip by angular_delta_limit for stability. for (int j = TAIL; j < chain_size; j++) { Vector3 to_tail = p_setting->chain[j] - current_head;