Пример #1
0
        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();
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }