public void Break(Vector2 position) { var area = Area; Debug.Log(area); if (area > MinBreakArea) { var calc = new VoronoiCalculator(); var clip = new VoronoiClipper(); var sites = new Vector2[3]; for (int i = 0; i < sites.Length; i++) { var dist = Mathf.Abs(NormalizedRandom(0.0f, 1.0f / 2.0f)); var angle = 2.0f * Mathf.PI * Random.value; sites[i] = position + new Vector2( dist * Mathf.Cos(angle), dist * Mathf.Sin(angle)); } var diagram = calc.CalculateDiagram(sites); var clipped = new List <Vector2>(); for (int i = 0; i < sites.Length; i++) { clip.ClipSite(diagram, Polygon, i, ref clipped); if (clipped.Count > 0) { var newGo = Instantiate(gameObject, transform.parent); newGo.transform.localPosition = transform.localPosition; newGo.transform.localRotation = transform.localRotation; var bs = newGo.GetComponent <BreakableSurface>(); bs.Thickness = Thickness; bs.Polygon.Clear(); bs.Polygon.AddRange(clipped); var childArea = bs.Area; var rb = bs.GetComponent <Rigidbody>(); rb.mass = Rigidbody.mass * (childArea / area); } } gameObject.SetActive(false); Destroy(gameObject); } }
// calcula o diagrama de voronoi link para a implementação utilizada: https://github.com/OskarSigvardsson/unity-delaunay // serve mais para ser usar a triangulação de delaunay do resultado do diagrama public void BuildVoronoi() { var points2d = Graham.GetPointVectorList(); GK.VoronoiCalculator voronoiCalculator = new GK.VoronoiCalculator(); Diagram = voronoiCalculator.CalculateDiagram(Graham.GetPointVectorList()); //var extends = Map.GetComponent<MeshFilter>().mesh.bounds.size; //extends.Scale(Map.transform.localScale); VoronoiMesh = CreateVoronoiMesh(Diagram); BuildGraph(); }