void UpdateBodyData(ARFoundationBody arHumanBody)
        {
            var id = this.AddOrUpdateData(arHumanBody);

            this.AddOrUpdateTrait(id, TraitNames.Pose, arHumanBody.pose);

            if (BodyUpdated != null)
            {
                BodyUpdated(arHumanBody);
            }
        }
        void RemoveBodyData(ARFoundationBody arHumanBody)
        {
            var id = this.RemoveData(arHumanBody);

            this.RemoveTrait <bool>(id, TraitNames.Body);
            this.RemoveTrait <Pose>(id, TraitNames.Pose);

            if (BodyRemoved != null)
            {
                BodyRemoved(arHumanBody);
            }
        }
        ARFoundationBody GetOrAddBody(ARHumanBody arHumanBody)
        {
            var trackableId = arHumanBody.trackableId;

            if (!m_TrackedBodies.TryGetValue(trackableId, out var arfBody))
            {
                arfBody = new ARFoundationBody(trackableId.ToMarsId());
                m_TrackedBodies[trackableId] = arfBody;
                arfBody.UpdateARFoundationBody(arHumanBody, m_BodyRigInstance.transform, m_BodyRigAnimator.humanScale, m_JointToTransform, m_BodyPoseExtractor);
            }
            else
            {
                arfBody.UpdateARFoundationBody(arHumanBody, m_BodyRigInstance.transform, m_BodyRigAnimator.humanScale, m_JointToTransform, m_BodyPoseExtractor);
            }
            return(arfBody);
        }
示例#4
0
        internal static void UpdateARFoundationBody(this ARFoundationBody targetBody, ARHumanBody sourceBody,
                                                    Transform poseRig, float poseScale, Transform[] jointMapping, HumanPoseHandler poseExtractor)
        {
            // Pose and transform are the same
            poseRig.position = sourceBody.pose.position;
            poseRig.rotation = sourceBody.pose.rotation;

            // Load transforms into temporary mesh
            var joints = sourceBody.joints;

            if (joints.IsCreated)
            {
                for (var i = 0; i < ARKitJointIndices.Total; ++i)
                {
                    var joint = joints[i];
                    var bone  = jointMapping[i];
                    if (bone != null)
                    {
                        var boneTransform = bone.transform;
                        boneTransform.localPosition = joint.localPose.position;
                        boneTransform.localRotation = joint.localPose.rotation;
                    }
                }
            }

            // Read out pose
            poseExtractor.GetHumanPose(ref targetBody.BodyPoseInternal);

            targetBody.pose = new Pose {
                position = (targetBody.BodyPoseInternal.bodyPosition * poseScale - poseRig.localPosition) * poseRig.lossyScale.y + poseRig.position,
                rotation = targetBody.BodyPoseInternal.bodyRotation
            };

            targetBody.Height     = k_ControlRigHeight * sourceBody.estimatedHeightScaleFactor;
            targetBody.DeviceData = sourceBody;
        }