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); }