private static float CalculateJointLength(JointEnumArray.IReadOnly joints)
        {
            var len     = 0f;
            var lastPos = joints[HandJointName.Wrist].pose.pos;

            foreach (var jointPose in joints.ValuesFrom(HandJointName.MiddleMetacarpal, HandJointName.MiddleTip))
            {
                if (jointPose.isValid)
                {
                    var pos = jointPose.pose.pos;
                    len    += (pos - lastPos).magnitude;
                    lastPos = pos;
                }
            }
            return(len);
        }
        private void UpdateFingerJoints(JointEnumArray.IReadOnly roomSpaceJoints, Transform parentTransform, RigidPose roomSpaceParentPoseInverse, HandJointName startJoint, HandJointName endJoint)
        {
            foreach (var index in EnumArrayBase <HandJointName> .StaticEnumsFrom(startJoint, endJoint))
            {
                var jointTrans = m_modelJoints[index];
                if (jointTrans == null)
                {
                    continue;
                }

                var data = roomSpaceJoints[index];
                if (!data.isValid)
                {
                    continue;
                }

                var parentSpaceJointPose = roomSpaceParentPoseInverse * data.pose;
                UpdateJointTransformLocal(parentTransform, jointTrans, parentSpaceJointPose);
                parentTransform            = jointTrans;
                roomSpaceParentPoseInverse = data.pose.GetInverse();
            }
        }