Esempio n. 1
0
    void CreateOrUpdateHead(ARHumanBody arBody)
    {
        if (m_HeadPrefab == null)
        {
            Debug.Log("no prefab found");
            return;
        }

        Transform rootTransform = arBody.transform;

        if (rootTransform == null)
        {
            Debug.Log("no root transform found for ARHumanBody");
            return;
        }

        Transform headTransform;

        if (rootTransform.childCount <= 1)
        {
            GameObject go = Instantiate(m_HeadPrefab, rootTransform);
            headTransform = go.transform;
        }
        else
        {
            headTransform = rootTransform.GetChild(1);
        }

        XRHumanBodyJoint joint = arBody.joints[(int)JointIndices.head_joint];

        headTransform.localScale    = joint.anchorScale;
        headTransform.localRotation = joint.anchorPose.rotation;
        headTransform.localPosition = joint.anchorPose.position;
    }
Esempio n. 2
0
    void UpdateBody(ARHumanBody arBody)
    {
        Transform arBodyT = arBody.transform;

        if (arBodyT == null)
        {
            Debug.Log("No root transform found for ARHumanBody");
            return;
        }

        InitialiseObjects(arBodyT);

        /// Update joint placement
        NativeArray<XRHumanBodyJoint> joints = arBody.joints;
        if(!joints.IsCreated) return;

        /// Update placement of all joints
        foreach (KeyValuePair<JointIndices3D, Transform> item in bodyJoints)
        {
            UpdateJointTransform(item.Value, joints[(int)item.Key]);
        }

        /// Update all line renderers.
        for (int i = 0; i < lineRenderers.Length; i++)
        {
            lineRenderers[i].SetPositions(lineRendererTransforms[i]);
        }
    }
 static XRHumanBody ToHumanBody(ARHumanBody body)
 {
     return(new XRHumanBody()
     {
         trackableId = body.trackableId,
         pose = body.pose,
         estimatedHeightScaleFactor = body.estimatedHeightScaleFactor,
         trackingState = body.trackingState,
         nativePtr = IntPtr.Zero,
     });
 }
Esempio n. 4
0
        public void ApplyBodyPose(ARHumanBody body)
        {
            var joints = body.joints;

            if (!joints.IsCreated)
            {
                return;
            }

            string txt = "";

            for (int i = 0; i < k_NumSkeletonJoints; ++i)
            {
                XRHumanBodyJoint joint = joints[i];
                var bone = m_BoneMapping[i];
                if (bone != null)
                {
                    bone.transform.localPosition = joint.localPose.position;
                    bone.transform.localRotation = joint.localPose.rotation;
                    var str1 = joint.localPose.position.x + "," + joint.localPose.position.y + "," + joint.localPose.position.z;
                    var str2 = bone.transform.localEulerAngles.x + "," + bone.transform.localEulerAngles.y + "," + bone.transform.localEulerAngles.z;
                    txt += str1 + "\n";
                    txt += str2 + "\n";

                    //string[] xyz = str1.Split(',');
                    //bone.transform.localPosition = new Vector3(float.Parse(xyz[0]), float.Parse(xyz[1]), float.Parse(xyz[2]));
                    //xyz = str2.Split(',');
                    //bone.transform.localEulerAngles = new Vector3(float.Parse(xyz[0]), float.Parse(xyz[1]), float.Parse(xyz[2]));
                }
                else
                {
                    txt += "null\n";
                }
            }
            txt += "end\n";

            if (logic == null)
            {
                logic = GameObject.FindGameObjectWithTag("MainLogic").GetComponent <MainLogic>();
                if (logic == null)
                {
                    logic = GetComponent <MainLogic>();
                }
                Debug.Log("try to get logic");
                return;
            }

            logic.SendText(txt);
        }
        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);
        }
        void AddHumanBody(ARHumanBody humanBody)
        {
            // Debug.Log(humanBody.ToString());
            Transform root = humanBody.transform;

            var joints = humanBody.joints;

            foreach (var joint in joints)
            {
                if (!joint.tracked || joint.parentIndex < 0)
                {
                    continue;
                }
                Vector3 start = root.TransformPoint(joint.anchorPose.position);
                Vector3 end   = root.TransformPoint(joints[joint.parentIndex].anchorPose.position);
                this.joints.Add(new Joint(start, end));
            }
        }
    //Updates the positions of the Apparel when the user moves
    public void ApplyBodyPose(ARHumanBody body, Vector3 offset)
    {
        var joints = body.joints;

        if (!joints.IsCreated)                        //when the user leaves the frame
        {
            return;                                   //it returns as there is no user to augment the apparel
        }
        for (int i = 0; i < k_NumSkeletonJoints; ++i) //traversing  through all the joints of apparel
        {
            XRHumanBodyJoint joint = joints[i];
            var bone = m_BoneMapping[i];
            if (bone != null)
            {
                bone.transform.localPosition = joint.localPose.position + offset; //updates the position and rotation
                bone.transform.localRotation = joint.localPose.rotation;          //of the apparel
            }
        }
    }
        public void ApplyBodyPose(ARHumanBody body)
        {
            var joints = body.joints;

            if (!joints.IsCreated)
            {
                return;
            }

            for (int i = 0; i < k_NumSkeletonJoints; ++i)
            {
                XRHumanBodyJoint joint = joints[i];
                var bone = m_BoneMapping[i];
                if (bone != null)
                {
                    bone.transform.localPosition = joint.localPose.position;
                    bone.transform.localRotation = joint.localPose.rotation;
                }
            }
        }
Esempio n. 9
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;
        }