static List <Vector3> GetIntersections(Plane plane, MeshFilter filter, MeshData data) { List <Vector3> points = new List <Vector3>(); Vector3[] vertices = filter.sharedMesh.vertices; Ray ray = new Ray(); Triangle start = new Triangle(-1, -1, -1); int a = 0, b = 0; /* * Func<int, int, bool> debug = (int from, int to) => { * var v0 = filter.transform.TransformPoint(vertices[a]); * var v1 = filter.transform.TransformPoint(vertices[b]); * Debug.DrawLine(v0, v1, new Color(1f, 0f, 0f, 1.0f), 50f); * return true; * }; * * Func<Triangle, bool> debugTriangle = (Triangle t) => { * var v0 = filter.transform.TransformPoint(vertices[t.a]); * var v1 = filter.transform.TransformPoint(vertices[t.b]); * var v2 = filter.transform.TransformPoint(vertices[t.c]); * Debug.DrawLine(v0, v1, new Color(0f, 1f, 0f, 0.7f), 50f); * Debug.DrawLine(v1, v2, new Color(0f, 1f, 0f, 0.7f), 50f); * Debug.DrawLine(v2, v0, new Color(0f, 1f, 0f, 0.7f), 50f); * return false; * }; */ Func <Triangle, int, int, bool> intersect = (Triangle tri, int ignore0, int ignore1) => { for (int j = 0; j < 3; j++) { int index0 = tri[j]; int index1 = tri[(j + 1) % 3]; if ((index0 == ignore0 || index0 == ignore1) && (index1 == ignore0 || index1 == ignore1)) { continue; } var v0 = filter.transform.TransformPoint(vertices[index0]); var v1 = filter.transform.TransformPoint(vertices[index1]); if (!plane.SameSide(v0, v1)) { var dir = v1 - v0; ray.origin = v0; ray.direction = dir.normalized; float distance; if (plane.Raycast(ray, out distance)) { a = index0; b = index1; points.Add(ray.GetPoint(distance)); } return(true); } } return(false); }; List <Triangle> triangles = data.triangles; for (int i = 0, n = triangles.Count; i < n; i++) { var tri = triangles[i]; if (intersect(tri, -1, -1)) { start = tri; // debug(a, b); break; } } // not found intersection if (points.Count <= 0) { return(points); } Triangle next = data.GetCommon(start, a, b); while (next != start) { if (!intersect(next, a, b)) { break; } next = data.GetCommon(next, a, b); if (next == null) { // Debug.Log ("null error"); break; } } // Debug.Log (start == next); return(points); }