/// <summary> /// Generates a rock from a given set of points. /// </summary> public static Mesh GenerateRunTimeRock(IEnumerable <Vector3> points) { Mesh m = new Mesh(); m.name = "Cloud Partition"; List <int> triangles = new List <int>(); var vertices = points.Select(x => new Vertex(x)).ToList(); var result = ConvexHull.Create(vertices); m.vertices = result.Points.Select(x => x.ToVec()).ToArray(); var resultPoints = result.Points.ToList(); foreach (var face in result.Faces) { triangles.Add(resultPoints.IndexOf(face.Vertices[0])); triangles.Add(resultPoints.IndexOf(face.Vertices[1])); triangles.Add(resultPoints.IndexOf(face.Vertices[2])); } m.triangles = triangles.ToArray(); m.RecalculateNormals(); m = LowPolyConverter.Convert(m); //Converts the generated mesh to low poly return(m); }
public static Mesh LinearMesh(List <Vector3> points, int iterations, float thickness, int test) { List <GameObject> objects = new List <GameObject>(); int[] previous = new int[2]; for (int i = 0; i < iterations - 1; i++) { List <Vector3> temp = new List <Vector3>(); if (i == 0) { temp.Add(points[0]); temp.Add(points[1]); temp.Add(points[2]); temp.Add(points[3]); if (test == 2) { previous = new int[] { 2, 3 }; } else { temp.Add(points[0]); temp.Add(points[4]); temp.Add(points[5]); previous = new int[] { 3, 4, 5 }; } } else if (i < points.Count - 2) { if (test == 2) { temp.Add(points[previous[0]]); temp.Add(points[previous[1]]); temp.Add(points[previous[1] + 1]); temp.Add(points[previous[1] + 2]); previous = new int[] { previous[1] + 1, previous[1] + 2 }; } else { temp.Add(points[previous[0]]); temp.Add(points[previous[1]]); temp.Add(points[previous[2]]); temp.Add(points[previous[2] + 1]); temp.Add(points[previous[2] + 2]); temp.Add(points[previous[2] + 3]); previous = new int[] { previous[2] + 1, previous[2] + 2, previous[2] + 3 }; } } else { temp.Add(points[points.Count - 1]); temp.Add(points[points.Count]); temp.Add(points[0]); temp.Add(points[1]); if (test == 2) { temp.Add(points[points.Count - 2]); temp.Add(points[2]); } } List <Vector3> lower = new List <Vector3>(temp); for (int z = 0; z < lower.Count; z++) { lower[z] -= new Vector3(0, thickness, 0); } temp.AddRange(lower); Mesh mesh = new Mesh(); mesh = MeshMaker.MeshFromPoints(temp); GameObject obj = new GameObject(); MeshFilter filter = obj.AddComponent <MeshFilter>(); obj.AddComponent <MeshRenderer>(); filter.sharedMesh = LowPolyConverter.Convert(mesh); objects.Add(obj); } Mesh combinedMesh = CombineMeshes.Combine(objects); foreach (GameObject obj in objects) { DestroyImmediate(obj); } return(combinedMesh); }