/// <summary>
    /// Gets the currently tracked surfaces.
    /// </summary>
    /// <returns>The tracked surfaces.</returns>
    public MultiARInterop.TrackedSurface[] GetTrackedSurfaces(bool bGetPoints)
    {
        MultiARInterop.TrackedSurface[] trackedPlanes = new MultiARInterop.TrackedSurface[0];

        if (surfaceRootTransform)
        {
            int numSurfaces = surfaceRootTransform.childCount;
            trackedPlanes = new MultiARInterop.TrackedSurface[numSurfaces];

            for (int i = 0; i < numSurfaces; i++)
            {
                Transform surfaceTransform = surfaceRootTransform.GetChild(i);
                trackedPlanes[i] = new MultiARInterop.TrackedSurface();

                trackedPlanes[i].position = surfaceTransform.position;
                trackedPlanes[i].rotation = surfaceTransform.rotation;

                if (bGetPoints)
                {
                    MeshFilter meshFilter = surfaceTransform.GetComponent <MeshFilter>();
                    Mesh       mesh       = meshFilter ? meshFilter.mesh : null;

                    trackedPlanes[i].bounds    = mesh ? mesh.bounds.size : Vector3.zero;                  // todo
                    trackedPlanes[i].points    = mesh ? mesh.vertices : null;
                    trackedPlanes[i].triangles = mesh ? mesh.triangles : null;
                }
            }
        }

        return(trackedPlanes);
    }
    /// <summary>
    /// Gets the currently tracked surfaces.
    /// </summary>
    /// <returns>The tracked surfaces.</returns>
    public MultiARInterop.TrackedSurface[] GetTrackedSurfaces(bool bGetPoints)
    {
        MultiARInterop.TrackedSurface[] trackedPlanes = new MultiARInterop.TrackedSurface[planeAnchorDict.Count];

        // get current planes list
        List <ARPlaneAnchorGameObject> listPlaneObjs = new List <ARPlaneAnchorGameObject>(planeAnchorDict.Values);
        int i = 0;

        foreach (ARPlaneAnchorGameObject arpag in listPlaneObjs)
        {
            ARPlaneAnchor planeAnchor = arpag.planeAnchor;
            trackedPlanes[i] = new MultiARInterop.TrackedSurface();

            // surface position & rotation
            Vector3    surfacePos = UnityARMatrixOps.GetPosition(planeAnchor.transform);           // Vector3.zero; //
            Quaternion surfaceRot = UnityARMatrixOps.GetRotation(planeAnchor.transform);           // Quaternion.identity; //

            // add the center offset
            Vector3 centerPos = planeAnchor.center;
            centerPos.z = -centerPos.z;

            centerPos   = surfaceRot * centerPos;
            surfacePos += centerPos;

            trackedPlanes[i].position = surfacePos;
            trackedPlanes[i].rotation = surfaceRot;
            trackedPlanes[i].bounds   = planeAnchor.extent;

            if (bGetPoints)
            {
//				List<Vector3> meshVertices = new List<Vector3>();
//
//				Vector3 planeHalf = planeAnchor.extent * 0.5f;
//				meshVertices.Add(new Vector3(-planeHalf.x, planeHalf.y, planeHalf.z));
//				meshVertices.Add(new Vector3(planeHalf.x, planeHalf.y, planeHalf.z));
//				meshVertices.Add(new Vector3(planeHalf.x, planeHalf.y, -planeHalf.z));
//				meshVertices.Add(new Vector3(-planeHalf.x, planeHalf.y, -planeHalf.z));
//
//				trackedPlanes[i].points = meshVertices.ToArray();
//
//				// get mesh indices
//				List<int> meshIndices = MultiARInterop.GetMeshIndices(meshVertices.Count);
//				trackedPlanes[i].triangles = meshIndices.ToArray();

                trackedPlanes[i].points    = planeAnchor.planeGeometry.vertices;
                trackedPlanes[i].triangles = planeAnchor.planeGeometry.triangleIndices;
            }

            i++;
        }

        // clear temporary lists
        listPlaneObjs.Clear();

        return(trackedPlanes);
    }
Ejemplo n.º 3
0
    /// <summary>
    /// Gets the currently tracked surfaces.
    /// </summary>
    /// <returns>The tracked surfaces.</returns>
    public MultiARInterop.TrackedSurface[] GetTrackedSurfaces(bool bGetPoints)
    {
        if (arInterface != null)
        {
            return(arInterface.GetTrackedSurfaces(bGetPoints));
        }

        // no tracked planes
        MultiARInterop.TrackedSurface[] trackedPlanes = new MultiARInterop.TrackedSurface[0];
        return(trackedPlanes);
    }
Ejemplo n.º 4
0
    /// <summary>
    /// Gets the currently tracked surfaces.
    /// </summary>
    /// <returns>The tracked surfaces.</returns>
    public MultiARInterop.TrackedSurface[] GetTrackedSurfaces(bool bGetPoints)
    {
        MultiARInterop.TrackedSurface[] trackedPlanes = new MultiARInterop.TrackedSurface[allTrackedPlanes.Count];

        for (int i = 0; i < allTrackedPlanes.Count; i++)
        {
            DetectedPlane surface = allTrackedPlanes[i];
            trackedPlanes[i] = new MultiARInterop.TrackedSurface();

            trackedPlanes[i].position = surface.CenterPose.position;
            trackedPlanes[i].rotation = surface.CenterPose.rotation;
            trackedPlanes[i].bounds   = new Vector3(surface.ExtentX, 0f, surface.ExtentZ);

            if (bGetPoints)
            {
                List <Vector3> alPoints = new List <Vector3>();
                surface.GetBoundaryPolygon(alPoints);

                int        vertexCount = alPoints.Count;
                Quaternion invRot      = Quaternion.Inverse(surface.CenterPose.rotation);
                Vector3    centerPos   = surface.CenterPose.position;

                for (int v = vertexCount - 1; v >= 0; v--)
                {
                    alPoints[v] -= centerPos;
                    alPoints[v]  = invRot * alPoints[v];

                    if (Mathf.Abs(alPoints[v].y) > 0.1f)
                    {
                        alPoints.RemoveAt(v);
                    }
                }

                // get mesh indices
                List <int> meshIndices = MultiARInterop.GetMeshIndices(vertexCount);

                trackedPlanes[i].points    = alPoints.ToArray();
                trackedPlanes[i].triangles = meshIndices.ToArray();
            }
        }

        return(trackedPlanes);
    }