static XRFace XRFaceFromIMRFace(IMRFace mrFace)
        {
            var face = new XRFace
            {
                m_TrackableId   = new TrackableId(mrFace.id.subId1, mrFace.id.subId2),
                m_Pose          = mrFace.pose,
                m_TrackingState = TrackingState.Tracking,
#if ARSUBSYSTEMS_3_OR_NEWER
                m_LeftEyePose  = Pose.identity,
                m_RightEyePose = Pose.identity,
#endif
            };

#if ARSUBSYSTEMS_3_OR_NEWER
            if (mrFace.LandmarkPoses.TryGetValue(MRFaceLandmark.LeftEye, out var pose))
            {
                face.m_LeftEyePose = new Pose(pose.position - mrFace.pose.position,
                                              Quaternion.Inverse(mrFace.pose.rotation) * pose.rotation);
            }
            if (mrFace.LandmarkPoses.TryGetValue(MRFaceLandmark.RightEye, out pose))
            {
                face.m_RightEyePose = new Pose(pose.position - mrFace.pose.position,
                                               Quaternion.Inverse(mrFace.pose.rotation) * pose.rotation);
            }
#endif

            return(face);
        }
Пример #2
0
        void OnFaceAdded(IMRFace face)
        {
            var id        = face.id;
            var landmarks = GetLandmarkSet(id.ToString());

            landmarks.SetEnabled(true);
            m_LandmarkSets[id] = landmarks;
            UpdateLandmarks(face, landmarks);
        }
 void OnFaceUpdated(IMRFace face)
 {
     m_FaceEvents.Add(new FaceEvent
     {
         Time      = GetCurrentTime(),
         FaceData  = new SerializedFaceData(face, m_LandmarkEnumValues, m_ExpressionEnumValues),
         EventType = TrackableEventType.Updated
     });
 }
            void FaceRemoved(IMRFace face)
            {
                if (!m_AddedFaces.Remove(face.id))
                {
                    m_UpdatedFaces.Remove(face.id);
                    m_RemovedFaces.Add(face.id);
                }

                m_Faces.Remove(new TrackableId(face.id.subId1, face.id.subId2));
            }
 void FaceUpdated(IMRFace face)
 {
     if (m_Faces.TryGetValue(face.id, out var faceObj))
     {
         faceObj.transform.SetLocalPose(this.ApplyOffsetToPose(face.pose));
     }
     else
     {
         FaceAdded(face);
     }
 }
        void FaceRemoved(IMRFace face)
        {
            // destroy face mesh
            if (m_FaceMeshRenderer != null)
            {
                UnityObjectUtils.Destroy(m_FaceMeshRenderer.gameObject);
            }

            // reset reference
            m_FaceMeshRenderer = null;
        }
Пример #7
0
        void OnFaceRemoved(IMRFace face)
        {
            LandmarkSet landmarks;
            var         id = face.id;

            if (m_LandmarkSets.TryGetValue(id, out landmarks))
            {
                landmarks.SetEnabled(false);
                m_LandmarkSets.Remove(id);
                m_LandmarkSetPool.Enqueue(landmarks);
            }
        }
 void FaceUpdated(IMRFace face)
 {
     if (m_AddedFaces.ContainsKey(face.id))
     {
         m_AddedFaces[face.id] = face;
     }
     else
     {
         m_UpdatedFaces[face.id] = face;
     }
     m_Faces[new TrackableId(face.id.subId1, face.id.subId2)] = face;
 }
        void FaceRemoved(IMRFace face)
        {
            var id            = face.id;
            var faceContainer = m_Faces[id];

            m_FacePool.Enqueue(faceContainer);
            m_Faces.Remove(id);
            var faceObject = faceContainer.gameObject;

            if (faceObject)
            {
                faceObject.SetActive(false);
            }
        }
Пример #10
0
        void OnFaceUpdated(IMRFace face)
        {
            LandmarkSet landmarks;
            var         id = face.id;

            if (!m_LandmarkSets.TryGetValue(id, out landmarks))
            {
                landmarks = GetLandmarkSet(id.ToString());
                landmarks.SetEnabled(true);
                m_LandmarkSets[id] = landmarks;
            }

            UpdateLandmarks(face, landmarks);
        }
        void FaceAdded(IMRFace face)
        {
            Debug.Assert(m_FaceMeshRenderer == null);

            // spawn face mesh
            var faceGO = Instantiate(m_FaceMeshPrefab);

            faceGO.hideFlags   = HideFlags.DontSave;
            m_FaceMeshRenderer = faceGO.GetComponent <MeshRenderer>();

            // get initial size and scale
            var scaledSize   = m_FaceMeshRenderer.bounds.size;
            var initialScale = m_FaceMeshRenderer.transform.localScale;

            // calculate unscaled size
            m_OriginalUnscaledSize.x = initialScale.x > 0 ? scaledSize.x / initialScale.x : scaledSize.x;
            m_OriginalUnscaledSize.y = initialScale.y > 0 ? scaledSize.y / initialScale.y : scaledSize.y;
            m_OriginalUnscaledSize.z = initialScale.z > 0 ? scaledSize.z / initialScale.z : scaledSize.z;

            FaceUpdated(face);
        }
        /// <summary>
        /// Calculates the Bounds of a MRFace using landmark positions.
        /// </summary>
        /// <returns>The min Bounds tha contains all the present face landmarks</returns>
        /// <param name="face">Face.</param>
        public static Bounds GetBounds(this IMRFace face)
        {
            // face pose position as the bound's center
            var center = face.pose.position;

            // default size
            var size = Vector3.one;

            // calculate size from landmarks
            if (face.LandmarkPoses != null)
            {
                // get extreme landmark positions
                var lowestX  = float.PositiveInfinity;
                var highestX = float.NegativeInfinity;
                var lowestY  = float.PositiveInfinity;
                var highestY = float.NegativeInfinity;
                var lowestZ  = float.PositiveInfinity;
                var highestZ = float.NegativeInfinity;
                foreach (var landmarkPose in face.LandmarkPoses)
                {
                    var landmarkPosition = landmarkPose.Value.position;

                    lowestX  = Mathf.Min(lowestX, landmarkPosition.x);
                    highestX = Mathf.Max(highestX, landmarkPosition.x);

                    lowestY  = Mathf.Min(lowestY, landmarkPosition.y);
                    highestY = Mathf.Max(highestY, landmarkPosition.y);

                    lowestZ  = Mathf.Min(lowestZ, landmarkPosition.z);
                    highestZ = Mathf.Max(highestZ, landmarkPosition.z);
                }

                // calculate bounding box using the extreme values
                size.x = highestX - lowestX;
                size.y = highestY - lowestY;
                size.z = highestZ - lowestZ;
            }

            return(new Bounds(center, size));
        }
Пример #13
0
        /// <summary>
        /// Constructs a <see cref="SerializedFaceData"/> from an <see cref="IMRFace"/>
        /// </summary>
        /// <param name="face">Face data to serialize</param>
        /// <param name="landmarkEnumValues">Enumeration values to map 1:1 with serialized array of face landmark poses</param>
        /// <param name="expressionEnumValues">Enumeration values to map 1:1 with serialized array of face expression coefficients</param>
        public SerializedFaceData(IMRFace face, MRFaceLandmark[] landmarkEnumValues, MRFaceExpression[] expressionEnumValues)
        {
            m_ID   = face.id;
            m_Pose = face.pose;
            m_Mesh = face.Mesh;

            var landmarksCount = landmarkEnumValues.Length;

            m_LandmarkPoses = new Pose[landmarksCount];
            for (var i = 0; i < landmarksCount; i++)
            {
                m_LandmarkPoses[i] = face.LandmarkPoses[landmarkEnumValues[i]];
            }

            var expressionsCount = expressionEnumValues.Length;

            m_ExpressionValues = new float[expressionsCount];
            for (var i = 0; i < expressionsCount; i++)
            {
                m_ExpressionValues[i] = face.Expressions[expressionEnumValues[i]];
            }
        }
        void FaceUpdated(IMRFace face)
        {
            Debug.Assert(m_FaceMeshRenderer != null);

            m_FaceMeshRenderer.transform.SetPositionAndRotation(face.pose.position, face.pose.rotation);

            // get current face's desired size (based on landmarks)
            var targetSize = face.GetBounds().size;

            // dynamic scale (not keeping aspect ratio)
            m_DynamicScale.x = m_OriginalUnscaledSize.x > 0 ? targetSize.x / m_OriginalUnscaledSize.x : targetSize.x;
            m_DynamicScale.y = m_OriginalUnscaledSize.y > 0 ? targetSize.y / m_OriginalUnscaledSize.y : targetSize.y;
            m_DynamicScale.z = m_OriginalUnscaledSize.z > 0 ? targetSize.z / m_OriginalUnscaledSize.z : targetSize.z;

            // get average scale from the axis (to keep aspect ratio)
            var averageScale = (m_DynamicScale.x + m_DynamicScale.y + m_DynamicScale.z) / 3;

            m_DynamicScale.Set(averageScale, averageScale, averageScale);

            // apply dynamic scale and scale factor
            m_FaceMeshRenderer.transform.localScale = m_DynamicScale * m_ScaleFactor;
        }
Пример #15
0
        void UpdateLandmarks(IMRFace face, LandmarkSet landmarkSet)
        {
            var points        = landmarkSet.points;
            var renderers     = landmarkSet.renderers;
            var landmarkPoses = face.LandmarkPoses;
            var landmarkCount = points.Length;
            var sphereScale   = this.GetCameraScale() * m_Scale * Vector3.one;

            for (var i = 0; i < landmarkCount; i++)
            {
                Pose pose;
                if (landmarkPoses.TryGetValue((MRFaceLandmark)i, out pose))
                {
                    var point = points[i];
                    point.SetWorldPose(this.ApplyOffsetToPose(pose));
                    point.localScale     = sphereScale;
                    renderers[i].enabled = true;
                }
                else
                {
                    renderers[i].enabled = false;
                }
            }
        }
        void FaceAdded(IMRFace face)
        {
            var faceContainer = GetFace();

            m_Faces.Add(face.id, faceContainer);
            faceContainer.gameObject.SetActive(true);
            var faceTransform = faceContainer.transform;

            faceTransform.SetLocalPose(this.ApplyOffsetToPose(face.pose));
            var meshFilter = faceContainer.meshFilter;

            if (meshFilter != null)
            {
                var faceMesh = face.Mesh;
                if (faceMesh != null)
                {
                    meshFilter.sharedMesh = faceMesh;
                }
                else
                {
                    meshFilter.GetComponent <MeshRenderer>().enabled = false;
                }
            }
        }
 void FaceAdded(IMRFace face)
 {
     m_AddedFaces.Add(face.id, face);
     m_Faces.Add(new TrackableId(face.id.subId1, face.id.subId2), face);
 }