void OnDrawGizmos() { if (nd == null) { return; } plane.ComputePlane(nd.transform.position, nd.transform.forward); Vector3 nSize = Vector3.one / 2.0f; List <Vector3> upper = new List <Vector3>(); List <Vector3> lower = new List <Vector3>(); List <Vector3> intersection = new List <Vector3>(); plane.IntersectTriangleHull(pt1.transform.position, pt2.transform.position, pt3.transform.position, upper, lower, intersection); if (drawPoints) { Gizmos.color = Color.yellow; Gizmos.DrawWireCube(pt1.transform.position, Vector3.one); Gizmos.DrawWireCube(pt2.transform.position, Vector3.one); Gizmos.DrawWireCube(pt3.transform.position, Vector3.one); Gizmos.color = Color.green; foreach (Vector3 v in upper) { Gizmos.DrawCube(v, nSize); } Gizmos.color = Color.blue; foreach (Vector3 v in lower) { Gizmos.DrawCube(v, nSize); } Gizmos.color = Color.red; foreach (Vector3 v in intersection) { Gizmos.DrawCube(v, nSize); } } if (drawTriangles) { upper.AddRange(intersection); lower.AddRange(intersection); List <int> indices = new List <int>(); Triangulator.TriangulateNDSlice(upper, indices); Gizmos.color = Color.green; for (int i = 0; i < indices.Count; i += 3) { Gizmos.DrawLine(upper[indices[i]], upper[indices[i + 1]]); Gizmos.DrawLine(upper[indices[i + 1]], upper[indices[i + 2]]); Gizmos.DrawLine(upper[indices[i + 2]], upper[indices[i]]); } Gizmos.color = Color.blue; indices.Clear(); Triangulator.TriangulateNDSlice(lower, indices); for (int i = 0; i < indices.Count; i += 3) { Gizmos.DrawLine(lower[indices[i]], lower[indices[i + 1]]); Gizmos.DrawLine(lower[indices[i + 1]], lower[indices[i + 2]]); Gizmos.DrawLine(lower[indices[i + 2]], lower[indices[i]]); } } }
private void Split() { NDPlane plane = new NDPlane(); plane.ComputePlane((mpta + mptb + mptc) / 3, RandomVector3()); List <Vector3> upper = new List <Vector3>(); List <Vector3> lower = new List <Vector3>(); List <Vector3> intersection = new List <Vector3>(); plane.IntersectTriangleHull(mpta, mptb, mptc, upper, lower, intersection); upper.AddRange(intersection); lower.AddRange(intersection); List <int> indices = new List <int>(); // UPPER HULL Triangulator.TriangulateNDSlice(upper, indices); for (int i = 0; i < indices.Count; i += 3) { RenderTriangle tri = new RenderTriangle(); Vector3 pta = upper[indices[i]]; Vector3 ptb = upper[indices[i + 1]]; Vector3 ptc = upper[indices[i + 2]]; Vector2 uva = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref pta); Vector2 uvb = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref ptb); Vector2 uvc = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref ptc); tri.SetPoints(pta, ptb, ptc); tri.SetUV(uva, uvb, uvc); splits.Add(tri); } indices.Clear(); // LOWER HULL Triangulator.TriangulateNDSlice(lower, indices); for (int i = 0; i < indices.Count; i += 3) { RenderTriangle tri = new RenderTriangle(); Vector3 pta = lower[indices[i]]; Vector3 ptb = lower[indices[i + 1]]; Vector3 ptc = lower[indices[i + 2]]; Vector2 uva = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref pta); Vector2 uvb = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref ptb); Vector2 uvc = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref ptc); tri.SetPoints(pta, ptb, ptc); tri.SetUV(uva, uvb, uvc); splits.Add(tri); } }