private void ReplaceMesh(Mesh mesh, MeshPiece tempMesh) { mesh.Clear(); mesh.SetVertices(tempMesh.Vertices); mesh.SetTriangles(tempMesh.Triangles, 0); mesh.SetNormals(tempMesh.Normals); mesh.SetUVs(0, tempMesh.UVs); mesh.RecalculateTangents(); }
public MeshSlicer() { _originalVertices = new List <Vector3> (INITIAL_ARRAY_SIZE); _originalTriangles = new List <int> (INITIAL_ARRAY_SIZE * 3); _originalNormals = new List <Vector3> (INITIAL_ARRAY_SIZE); _originalUVs = new List <Vector2> (INITIAL_ARRAY_SIZE); _intersectPairs = new Vector3[2]; _tempTriangles = new Vector3[3]; _addedPairs = new List <Vector3> (INITIAL_ARRAY_SIZE); _intersection = new MeshIntersection(); _meshA = new MeshPiece(INITIAL_ARRAY_SIZE); _meshB = new MeshPiece(INITIAL_ARRAY_SIZE); }
public void SliceObject(GameObject obj, float[] slicePoints) { Bounds objBounds = obj.GetComponent <MeshFilter> ().mesh.bounds; Vector3 objBottomLeft = obj.transform.position + objBounds.min; Vector3 objSize = objBounds.size; for (int i = 0; i < slicePoints.Length; i++) { Vector3 transformedNormal = ((Vector3)(obj.transform.localToWorldMatrix.transpose * Vector2.up)).normalized; Vector3 slicePoint = new Vector3( objBottomLeft.x, objBottomLeft.y + objSize.y * slicePoints[i], objBottomLeft.z ); _slicePlane.SetNormalAndPosition( transformedNormal, obj.transform.InverseTransformPoint(slicePoint) ); Mesh mesh = obj.GetComponent <MeshFilter> ().mesh; if (!SliceMesh(mesh, ref _slicePlane)) { return; } bool posBigger = _meshA.SurfaceArea > _meshB.SurfaceArea; if (posBigger) { _biggerMesh = _meshA; _smallerMesh = _meshB; } else { _biggerMesh = _meshB; _smallerMesh = _meshA; } GameObject newObj = GameObject.Instantiate(obj, obj.transform.parent); newObj.transform.SetPositionAndRotation(obj.transform.position, obj.transform.rotation); Mesh newObjMesh = newObj.GetComponent <MeshFilter> ().mesh; ReplaceMesh(mesh, _biggerMesh); ReplaceMesh(newObjMesh, _smallerMesh); } }
public bool TrianglePlaneIntersect(List <Vector3> vertices, List <Vector2> uvs, List <int> triangles, int startIndex, ref Plane plane, MeshPiece meshA, MeshPiece meshB, Vector3[] intersectVectors) { for (int i = 0; i < 3; ++i) { _ts[i] = triangles[startIndex + i]; _vs[i] = vertices[_ts[i]]; _us[i] = uvs[_ts[i]]; } meshA.ContainsKeys(triangles, startIndex, _isPositives); if (_isPositives[0] == _isPositives[1] && _isPositives[1] == _isPositives[2]) { (_isPositives[0] ? meshA : meshB).AddOriginalTriangle(_ts); return(false); } int lonelyPoint = 0; if (_isPositives[0] != _isPositives[1]) { lonelyPoint = _isPositives[0] != _isPositives[2] ? 0 : 1; } else { lonelyPoint = 2; } int prevPoint = lonelyPoint - 1; if (prevPoint == -1) { prevPoint = 2; } int nextPoint = lonelyPoint + 1; if (nextPoint == 3) { nextPoint = 0; } System.ValueTuple <Vector3, Vector2> newPointPrev = Intersect(plane, _vs[lonelyPoint], _vs[prevPoint], _us[lonelyPoint], _us[prevPoint]); System.ValueTuple <Vector3, Vector2> newPointNext = Intersect(plane, _vs[lonelyPoint], _vs[nextPoint], _us[lonelyPoint], _us[nextPoint]); (_isPositives[lonelyPoint] ? meshA : meshB).AddSlicedTriangle(_ts[lonelyPoint], newPointNext.Item1, newPointPrev.Item1, newPointNext.Item2, newPointPrev.Item2); (_isPositives[prevPoint] ? meshA : meshB).AddSlicedTriangle(_ts[prevPoint], newPointPrev.Item1, newPointPrev.Item2, _ts[nextPoint]); (_isPositives[prevPoint] ? meshA : meshB).AddSlicedTriangle(_ts[nextPoint], newPointPrev.Item1, newPointNext.Item1, newPointPrev.Item2, newPointNext.Item2); if (_isPositives[lonelyPoint]) { intersectVectors[0] = newPointPrev.Item1; intersectVectors[1] = newPointNext.Item1; } else { intersectVectors[0] = newPointNext.Item1; intersectVectors[1] = newPointPrev.Item1; } return(true); }