private void UpdateMessageData(StringBuilder sb, float fpsResult, ARFace face)
        {
            sb.Append("FPS= ").Append(fpsResult).Append(System.Environment.NewLine);
            ARPose pose = face.Pose;

            if (pose != null)
            {
                sb.Append("face pose information:");
                sb.Append("face pose tx:[").Append(pose.Tx()).Append("]").Append(System.Environment.NewLine);
                sb.Append("face pose ty:[").Append(pose.Ty()).Append("]").Append(System.Environment.NewLine);
                sb.Append("face pose tz:[").Append(pose.Tz()).Append("]").Append(System.Environment.NewLine);
                sb.Append("face pose qx:[").Append(pose.Qx()).Append("]").Append(System.Environment.NewLine);
                sb.Append("face pose qy:[").Append(pose.Qy()).Append("]").Append(System.Environment.NewLine);
                sb.Append("face pose qz:[").Append(pose.Qz()).Append("]").Append(System.Environment.NewLine);
                sb.Append("face pose qw:[").Append(pose.Qw()).Append("]").Append(System.Environment.NewLine);
            }
            sb.Append(System.Environment.NewLine);

            float[] textureCoordinates = new float[face.FaceGeometry.TextureCoordinates.Capacity()];
            for (int i = 0; i == face.FaceGeometry.TextureCoordinates.Capacity(); i++)
            {
                textureCoordinates[i] = face.FaceGeometry.TextureCoordinates.Get(i);
            }
            sb.Append("textureCoordinates length:[ ").Append(textureCoordinates.Length).Append(" ]");
        }
Пример #2
0
        /// <summary>
        ///  Calculate the distance between a point in a space and a plane. This method is used
        ///  to calculate the distance between a camera in a space and a specified plane.
        /// </summary>
        /// <param name="planePose">ARPose of a plane.</param>
        /// <param name="cameraPose">ARPose of a camera.</param>
        /// <returns>Calculation results.</returns>
        private static float CalculateDistanceToPlane(ARPose planePose, ARPose cameraPose)
        {
            // The dimension of the direction vector is 3.
            float[] normals = new float[3];

            // Obtain the unit coordinate vector of a normal vector of a plane.
            planePose.GetTransformedAxis(1, 1.0f, normals, 0);

            // Calculate the distance based on projection.
            return((cameraPose.Tx() - planePose.Tx()) * normals[0]     // 0:x
                   + (cameraPose.Ty() - planePose.Ty()) * normals[1]   // 1:y
                   + (cameraPose.Tz() - planePose.Tz()) * normals[2]); // 2:z
        }
        private List <ARPlane> GetSortedPlanes(System.Collections.ICollection allPlanes, ARPose cameraPose)
        {
            // Planes must be sorted by the distance from the camera so that we can
            // first draw the closer planes, and have them block the further planes.
            Java.Util.ArrayList pairPlanes = new Java.Util.ArrayList();
            foreach (Java.Lang.Object item in allPlanes)
            {
                ARPlane plane = item.JavaCast <ARPlane>();
                if ((plane.Type == ARPlane.PlaneType.UnknownFacing) ||
                    plane.TrackingState != ARTrackableTrackingState.Tracking ||
                    plane.SubsumedBy != null)
                {
                    continue;
                }

                // Store the normal vector of the current plane.
                float[] planeNormalVector = new float[3];
                ARPose  planeCenterPose   = plane.CenterPose;
                planeCenterPose.GetTransformedAxis(1, 1.0f, planeNormalVector, 0);

                // Calculate the distance from the camera to the plane. If the value is negative,
                // it indicates that the camera is behind the plane (the normal vector distinguishes
                // the front side from the back side).
                float distanceBetweenPlaneAndCamera = (cameraPose.Tx() - planeCenterPose.Tx()) * planeNormalVector[0]
                                                      + (cameraPose.Ty() - planeCenterPose.Ty()) * planeNormalVector[1]
                                                      + (cameraPose.Tz() - planeCenterPose.Tz()) * planeNormalVector[2];
                pairPlanes.Add(new Pair(plane, distanceBetweenPlaneAndCamera));
            }
            //Get Pair object from ArrayList
            List <Pair> sortedList = new List <Pair>();
            IIterator   myit       = pairPlanes.Iterator();

            while (myit.HasNext)
            {
                sortedList.Add((Pair)(myit.Next()));
            }
            //Sort Pair objects by plane in list
            sortedList.Sort(new PlanCompare());

            //Obtain plane list.
            List <ARPlane> listOfPlane = new List <ARPlane>();

            foreach (Pair item in sortedList)
            {
                listOfPlane.Add((item.First).JavaCast <ARPlane>());
            }

            return(listOfPlane);
        }