public TriangleMesh(VerticeMesh _first, VerticeMesh _second, VerticeMesh _third, int _indexMesh) { first = _first; second = _second; third = _third; indexMesh = _indexMesh; }
public void Convert() { List <TriangleMesh> trianglesMeshv2 = trianglesMesh; List <VerticeMesh> verticesMeshv2 = verticesMesh; triangulation.ForEach(triangleTriangulation => { if (triangleTriangulation.first.origin.index < 0 || triangleTriangulation.second.origin.index < 0 || triangleTriangulation.third.origin.index < 0) { return; } VerticeMesh first = verticesMeshv2.Find(verticeMesh => verticeMesh.indexMesh == triangleTriangulation.first.origin.index); VerticeMesh second = verticesMeshv2.Find(verticeMesh => verticeMesh.indexMesh == triangleTriangulation.second.origin.index); VerticeMesh third = verticesMeshv2.Find(verticeMesh => verticeMesh.indexMesh == triangleTriangulation.third.origin.index); trianglesMeshv2.Add(new TriangleMesh(first, second, third, -1)); }); List <Vector3> verticesFinal = new List <Vector3>(); List <int> trianglesFinal = new List <int>(); Vector3[] vert = new Vector3[verticesMesh.Count()]; verticesMesh.ForEach(verticeMesh => { vert[verticeMesh.indexMesh] = verticeMesh.position; }); trianglesMesh.ForEach(triangleMesh => { trianglesFinal.Add(triangleMesh.first.indexMesh); trianglesFinal.Add(triangleMesh.second.indexMesh); trianglesFinal.Add(triangleMesh.third.indexMesh); }); mesh.Clear(); mesh.vertices = vert; mesh.triangles = trianglesFinal.ToArray(); mesh.RecalculateBounds(); mesh.RecalculateNormals(); mesh.RecalculateTangents(); }
public void Destruction(Vector3 impact, float radiusExplosion, Vector3 impactDir) { //ConvertMeshToVerticesAndTriangles(mesh); // -- START VERTICE DELETION -- for (int i = 0; i < verticesMesh.Count; i++) { verticesMesh[i].toBeDeleted = Vector3.Distance(verticesMesh[i].position * transform.localScale.x, impact - transform.position) < radiusExplosion; } List <VerticeMesh> verticesToBeDeleted = verticesMesh.FindAll(verticeMesh => verticeMesh.toBeDeleted == true); int numVerticesToBeDeleted = 0; int numTrianglesToBeDeleted = 0; List <VerticeMesh> verticesEdgeHole = new List <VerticeMesh>(); for (int i = 0; i < verticesToBeDeleted.Count; i++) { List <TriangleMesh> trianglesToCheck = verticesToBeDeleted[i].triangles; while (trianglesToCheck.Count > 0) { TriangleMesh triangle = trianglesToCheck[0]; if (triangle.first.toBeDeleted) { triangle.first.triangles.Remove(triangle); } else { if (!verticesEdgeHole.Exists(verticeEdgeHole => verticeEdgeHole == triangle.first)) { verticesEdgeHole.Add(triangle.first); } } if (triangle.second.toBeDeleted) { triangle.second.triangles.Remove(triangle); } else { if (!verticesEdgeHole.Exists(verticeEdgeHole => verticeEdgeHole == triangle.second)) { verticesEdgeHole.Add(triangle.second); } } if (triangle.third.toBeDeleted) { triangle.third.triangles.Remove(triangle); } else { if (!verticesEdgeHole.Exists(verticeEdgeHole => verticeEdgeHole == triangle.third)) { verticesEdgeHole.Add(triangle.third); } } trianglesMesh.Remove(triangle); numTrianglesToBeDeleted++; } } numVerticesToBeDeleted = verticesMesh.RemoveAll(verticeMesh => verticeMesh.toBeDeleted == true); int indexVerticeMesh = 0; verticesMesh.ForEach(verticeMesh => verticeMesh.indexMesh = indexVerticeMesh++); /*for (int i = 0; i < verticesEdgeHole.Count ; i++) { * for (int j = i + 1; j < verticesEdgeHole.Count; j++) { * if (verticesEdgeHole[i].position.x == verticesEdgeHole[j].position.x && verticesEdgeHole[i].position.y == verticesEdgeHole[j].position.y && verticesEdgeHole[i].position.z == verticesEdgeHole[j].position.z) { * verticesEdgeHole.Remove(verticesEdgeHole[j]); * j--; * } * } * }*/ // ---- END VERTICE DELETION ---- //verticesEdgeHole //verticesMesh //trianglesMesh // START CREATING HOLE VERTICES Vector3 dirHole = new Vector3(0, 0, 0); Vector3 impactScaled = impact * 0.2f; List <VerticeMesh> layerHole = new List <VerticeMesh>(); List <VerticeMesh> newLayerHole = new List <VerticeMesh>(); List <VerticeMesh> verticesHole = new List <VerticeMesh>(); verticesEdgeHole.ForEach(verticeEdgeHole => { dirHole += (verticeEdgeHole.position - impactScaled); }); dirHole /= verticesEdgeHole.Count; dirHole.Normalize(); Vector3 pointToConverge = dirHole * (radiusExplosion / transform.localScale.x) * 0.3f; Vector3 pointToConvergeInverse = -dirHole * (radiusExplosion / transform.localScale.x) * 0.3f; for (int i = 1000; i < verticesEdgeHole.Count; i += 2) { VerticeMesh verticeHole = new VerticeMesh(verticesEdgeHole[i].position, indexVerticeMesh++); verticeHole.position = Vector3.Lerp(verticeHole.position, pointToConverge, (Random.Range(0.2f, 0.24f))); verticesHole.Add(verticeHole); } layerHole = verticesEdgeHole; for (int i = 3; i < 3; i++) { for (int j = 0; j < layerHole.Count; j++) { if (j % i == 0) { VerticeMesh verticeMesh = new VerticeMesh(Vector3.Lerp(layerHole[j].position, pointToConverge, i * (0.20f + Random.Range(-0.02f, 0.02f))), indexVerticeMesh++); newLayerHole.Add(verticeMesh); } } verticesHole = verticesHole.Concat(newLayerHole).ToList(); layerHole = newLayerHole; newLayerHole = new List <VerticeMesh>(); } verticesMesh = verticesMesh.Concat(verticesHole).ToList(); verticesHole = verticesHole.Concat(verticesEdgeHole).ToList(); // ---- END CREATING HOLE VERTICES ---- // START BOWYER WATSON WITH EDGE VERTICES AND VERTICES GENERATED Vector3 firstVectorPlane = Vector3.Cross(impactDir, Vector3.up); Vector3 secondVectorPlane = Vector3.Cross(impactDir, firstVectorPlane); Plane plane = new Plane(firstVectorPlane, secondVectorPlane); plane.DrawPlane(impact, 5f, 10f); //plane.normal = dirHole; List <Vertice> verticeForTriangulation = new List <Vertice>(); List <Vector3> pointsToCustomMesh = new List <Vector3>(); verticesHole.ForEach(verticeHole => { verticeForTriangulation.Add(new Vertice(PointProjectedInPlane(verticeHole.position, plane.normal), verticeHole.indexMesh)); verticeHole.position = PointProjectedInPlane(verticeHole.position, plane.normal); pointsToCustomMesh.Add(verticeHole.position); }); GameObject.Find("CustomMesh").GetComponent <CustomMesh>().points = pointsToCustomMesh; GameObject.Find("CustomMesh").GetComponent <CustomMesh>().plane = plane; GameObject.Find("CustomMesh").GetComponent <CustomMesh>().centerSphere = impactScaled; GameObject.Find("CustomMesh").GetComponent <CustomMesh>().radiusSphere = radiusExplosion / transform.localScale.x; GameObject.Find("CustomMesh").GetComponent <CustomMesh>().Startv2(); //currentTriangulation = new List<Triangle>(); //currentVertices = new List<Vertice>(); // SUPER TRIANGLE //CREATE VERTICES, PROJECT THEM INTO A PLANE AND ADD TO ARRAYS //int indexVertices = 0; //List<Vertice> verticesProjectedInPlane = new List<Vertice>(); /*points.ForEach(point => { * Vertice newVerticeProjected = new Vertice(PointProjectedInPlane(point, plane.normal), indexVertices); * Vertice newVerticeMesh = new Vertice(point, indexVertices); * Instantiate(_verticePrefab, point * transform.localScale.x + transform.position, Quaternion.identity); * * verticesProjectedInPlane.Add(newVerticeProjected); * currentVertices.Add(newVerticeMesh); * indexVertices++; * });*/ Triangle superTriangle = GetSuperTriangle(plane); List <Triangle> triangulation = BowyerWatson(verticeForTriangulation, plane, superTriangle); // ---- END BOWYER WATSON WITH EDGE VERTICES AND VERTICES GENERATED ---- // START CONVERTING VERTICE AND TRIANGLE DESTRUCTION + RECONSTRUCTION WITH BOWYER-WATSON TO MESH Vector3[] meshVertices; int[] meshTriangles; //trianglesMesh = new List<TriangleMesh>(); for (int i = 0; i < triangulation.Count; i++) { VerticeMesh first = verticesMesh.Find(verticeMesh => verticeMesh.indexMesh == triangulation[i].first.origin.index); VerticeMesh second = verticesMesh.Find(verticeMesh => verticeMesh.indexMesh == triangulation[i].second.origin.index); VerticeMesh third = verticesMesh.Find(verticeMesh => verticeMesh.indexMesh == triangulation[i].third.origin.index); TriangleMesh newTriangleMesh = new TriangleMesh(first, second, third, i); trianglesMesh.Add(newTriangleMesh); first.triangles.Add(newTriangleMesh); second.triangles.Add(newTriangleMesh); third.triangles.Add(newTriangleMesh); } ConvertTrianglesToMeshVerticesAndTriangles(verticesMesh, trianglesMesh, out meshVertices, out meshTriangles); mesh.Clear(); mesh.vertices = meshVertices; mesh.triangles = meshTriangles; mesh.RecalculateBounds(); mesh.RecalculateNormals(); mesh.RecalculateTangents(); // ---- END CONVERTING VERTICE AND TRIANGLE DESTRUCTION + RECONSTRUCTION WITH BOWYER-WATSON TO MESH ---- }
private IEnumerator Reconstructing() { while (verticeIndex < verticesMesh.Count) { List <VerticeMesh> newLayer = new List <VerticeMesh>(); newLayer = verticesMesh.GetRange(verticeIndex, countByLayer); verticeIndex += countByLayer; verticesDraw = verticesDraw.Concat(newLayer).ToList(); trianglesDraw = new List <TriangleMesh>(); for (int i = 0; i < trianglesMesh.Count; i++) { bool isAllVerticesPresent = true; isAllVerticesPresent &= verticesDraw.Exists(verticeDraw => verticeDraw.indexMesh == trianglesMesh[i].first.indexMesh); isAllVerticesPresent &= verticesDraw.Exists(verticeDraw => verticeDraw.indexMesh == trianglesMesh[i].second.indexMesh); isAllVerticesPresent &= verticesDraw.Exists(verticeDraw => verticeDraw.indexMesh == trianglesMesh[i].third.indexMesh); if (isAllVerticesPresent) { trianglesDraw.Add(trianglesMesh[i]); } } List <VerticeMesh> edgeHole = new List <VerticeMesh>(); for (int i = 0; i < verticesDraw.Count; i++) { bool isAllTrianlesPresent = true; for (int j = 0; j < verticesDraw[i].triangles.Count; j++) { if (!trianglesDraw.Exists(triangleDraw => triangleDraw == verticesDraw[i].triangles[j])) { isAllTrianlesPresent = false; break; } } if (!isAllTrianlesPresent) { edgeHole.Add(verticesDraw[i]); } } Vector3[] meshVertices; int[] meshTriangles; Plane plane = new Plane(Vector3.forward, Vector3.right); List <Vertice> verticesForTriangulation = new List <Vertice>(); for (int i = 0; i < edgeHole.Count; i++) { verticesForTriangulation.Add(new Vertice(PointProjectedInPlane(edgeHole[i].position, plane.normal), edgeHole[i].indexMesh)); } List <Triangle> triangulation = BowyerWatson(verticesForTriangulation, plane, GetSuperTriangle(plane)); for (int i = 0; i < triangulation.Count; i++) { VerticeMesh first = verticesMesh.Find(verticeMesh => verticeMesh.indexMesh == triangulation[i].first.origin.index); VerticeMesh second = verticesMesh.Find(verticeMesh => verticeMesh.indexMesh == triangulation[i].second.origin.index); VerticeMesh third = verticesMesh.Find(verticeMesh => verticeMesh.indexMesh == triangulation[i].third.origin.index); TriangleMesh newTriangleMesh = new TriangleMesh(first, second, third, i); trianglesDraw.Add(newTriangleMesh); } ConvertTrianglesToMeshVerticesAndTriangles(verticesMesh, trianglesDraw, out meshVertices, out meshTriangles); mesh.Clear(); mesh.vertices = meshVertices; mesh.triangles = meshTriangles; mesh.RecalculateBounds(); mesh.RecalculateNormals(); mesh.RecalculateTangents(); yield return(new WaitForSeconds(speedReconstruction)); } }
public void Destruction(Vector3 impact, float radiusExplosion, Vector3 impactDir) { //ConvertMeshToVerticesAndTriangles(mesh); // -- START VERTICE DELETION -- for (int i = 0; i < verticesMesh.Count; i++) { verticesMesh[i].toBeDeleted = Vector3.Distance(verticesMesh[i].position * transform.localScale.x, impact - transform.position) < radiusExplosion; } List <VerticeMesh> verticesToBeDeleted = verticesMesh.FindAll(verticeMesh => verticeMesh.toBeDeleted == true); int numVerticesToBeDeleted = 0; int numTrianglesToBeDeleted = 0; List <VerticeMesh> verticesEdgeHole = new List <VerticeMesh>(); for (int i = 0; i < verticesToBeDeleted.Count; i++) { List <TriangleMesh> trianglesToCheck = verticesToBeDeleted[i].triangles; while (trianglesToCheck.Count > 0) { TriangleMesh triangle = trianglesToCheck[0]; if (triangle.first.toBeDeleted) { triangle.first.triangles.Remove(triangle); } else { if (!verticesEdgeHole.Exists(verticeEdgeHole => verticeEdgeHole == triangle.first)) { verticesEdgeHole.Add(triangle.first); } } if (triangle.second.toBeDeleted) { triangle.second.triangles.Remove(triangle); } else { if (!verticesEdgeHole.Exists(verticeEdgeHole => verticeEdgeHole == triangle.second)) { verticesEdgeHole.Add(triangle.second); } } if (triangle.third.toBeDeleted) { triangle.third.triangles.Remove(triangle); } else { if (!verticesEdgeHole.Exists(verticeEdgeHole => verticeEdgeHole == triangle.third)) { verticesEdgeHole.Add(triangle.third); } } trianglesMesh.Remove(triangle); numTrianglesToBeDeleted++; } } numVerticesToBeDeleted = verticesMesh.RemoveAll(verticeMesh => verticeMesh.toBeDeleted == true); int indexVerticeMesh = 0; verticesMesh.ForEach(verticeMesh => verticeMesh.indexMesh = indexVerticeMesh++); // ---- END VERTICE DELETION ---- //verticesEdgeHole //verticesMesh //trianglesMesh // START CREATING HOLE VERTICES Vector3 dirHole = new Vector3(0, 0, 0); Vector3 impactScaled = impact * 0.2f; verticesEdgeHole.ForEach(verticeEdgeHole => { dirHole += (verticeEdgeHole.position - impactScaled); }); dirHole /= verticesEdgeHole.Count; dirHole.Normalize(); Vector3 pointToConverge = dirHole * (radiusExplosion / transform.localScale.x) * 0.3f; List <VerticeMesh> layerHole = new List <VerticeMesh>(); List <VerticeMesh> newLayerHole = new List <VerticeMesh>(); List <VerticeMesh> verticesHole = new List <VerticeMesh>(); layerHole = verticesEdgeHole; verticesEdgeHole.ForEach(verticeEdgeHole => { verticeEdgeHole.position = Vector3.Lerp(verticeEdgeHole.position, pointToConverge, (Random.Range(0, 0.9f))); }); for (float i = 0; i < verticesEdgeHole.Count; i += 0.5f) { verticesEdgeHole.RemoveAt(Mathf.FloorToInt(i)); } for (int i = 3; i < 3; i++) { for (int j = 0; j < layerHole.Count; j++) { if (j % i == 0) { VerticeMesh verticeMesh = new VerticeMesh(Vector3.Lerp(layerHole[j].position, pointToConverge, i * (0.20f + Random.Range(-0.02f, 0.02f))), indexVerticeMesh++); newLayerHole.Add(verticeMesh); } } verticesHole = verticesHole.Concat(newLayerHole).ToList(); layerHole = newLayerHole; newLayerHole = new List <VerticeMesh>(); } verticesMesh = verticesMesh.Concat(verticesHole).ToList(); verticesHole = verticesHole.Concat(verticesEdgeHole).ToList(); // ---- END CREATING HOLE VERTICES ---- // START BOWYER WATSON WITH EDGE VERTICES AND VERTICES GENERATED Vector3 firstVectorPlane = Vector3.Cross(impactDir, Vector3.up); Vector3 secondVectorPlane = Vector3.Cross(impactDir, firstVectorPlane); Plane plane = new Plane(firstVectorPlane, secondVectorPlane); plane.DrawPlane(impact, 5f, 10f); //plane.normal = dirHole; List <Vertice> verticeForTriangulation = new List <Vertice>(); List <Vector3> pointsToCustomMesh = new List <Vector3>(); verticesHole.ForEach(verticeHole => { verticeForTriangulation.Add(new Vertice(verticeHole.position, verticeHole.indexMesh)); pointsToCustomMesh.Add(verticeHole.position); }); GameObject.Find("CustomMesh").GetComponent <CustomMesh>().points = pointsToCustomMesh; GameObject.Find("CustomMesh").GetComponent <CustomMesh>().plane = plane; GameObject.Find("CustomMesh").GetComponent <CustomMesh>().Startv2(); //StartCoroutine(BowyerWatsonv3(verticeForTriangulation, plane)); // ---- END BOWYER WATSON WITH EDGE VERTICES AND VERTICES GENERATED ---- // START CONVERTING VERTICE AND TRIANGLE DESTRUCTION + RECONSTRUCTION WITH BOWYER-WATSON TO MESH // ---- END CONVERTING VERTICE AND TRIANGLE DESTRUCTION + RECONSTRUCTION WITH BOWYER-WATSON TO MESH ---- }