Ejemplo n.º 1
0
    public static List <Orient> GetTiles(Rect area)
    {
        float tileHeight = 0.045f;
        var   bounds     = new Bounds(
            new Vector3(area.center.x, 0.3f, area.center.y),
            new Vector3(area.width, 0.6f - tileHeight, area.height)
            );

        Vector3[] basePoints;
        Vector3[] markers;

        using (var motive = new Motive())
        {
            if (!motive.mDataListner.Connected)
            {
                Debug.Log("Can't connect to camera.");
                return(null);
            }

            basePoints = motive.GetFrameMarkers().ToArray();
            markers    = motive.GetUnlabledMarkers().ToArray();
        }

        if (basePoints.Length != 3)
        {
            Debug.Log("Error in base frame markers.");
            return(null);
        }

        var tiles = new List <Orient>();

        var sortedBasePoints = basePoints.OrderBy(m => m.magnitude).ToList();
        var origin           = sortedBasePoints[0];
        var vx = sortedBasePoints[2] - origin;
        var vz = sortedBasePoints[1] - origin;
        var vy = Vector3.Cross(vz, vx);

        vz = Vector3.Cross(vx, vy);
        var q    = Quaternion.LookRotation(vz, vy);
        var invq = Quaternion.Inverse(q);

        var sortedMarkers = markers.Select(m => invq * (m - origin))
                            .Where(m => bounds.Contains(m))
                            .OrderByDescending(m => m.y)
                            .ToList();

        foreach (var marker in sortedMarkers)
        {
            Debug.DrawRay(marker, Vector3.up * 0.005f, Color.red, 15);
        }

        while (sortedMarkers.Count >= 3 && tiles.Count == 0)
        {
            var topHeight       = sortedMarkers.First().y;
            var topLayerMarkers = sortedMarkers.Where(m => Abs(m.y - topHeight) < tileHeight * 0.5f).ToList();
            sortedMarkers.RemoveAt(0);

            foreach (var marker in topLayerMarkers)
            {
                var tile = FindTile(marker, topLayerMarkers);
                if (tile != null)
                {
                    tiles.Add((Orient)tile);
                }
            }
        }

        return(tiles);
    }