Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections.Generic;
- public class MoellonCutter
- {
- public struct CutResult
- {
- public Mesh topMesh;
- public Mesh bottomMesh;
- }
- public CutResult Cut(Mesh originalMesh, Vector3 planePoint, Vector3 planeNormal)
- {
- List<Vector3> topVertices = new List<Vector3>();
- List<int> topTriangles = new List<int>();
- List<Vector3> bottomVertices = new List<Vector3>();
- List<int> bottomTriangles = new List<int>();
- Vector3[] vertices = originalMesh.vertices;
- int[] triangles = originalMesh.triangles;
- Plane cuttingPlane = new Plane(planeNormal.normalized, planePoint);
- for (int i = 0; i < triangles.Length; i += 3)
- {
- int i0 = triangles[i];
- int i1 = triangles[i + 1];
- int i2 = triangles[i + 2];
- Vector3 v0 = vertices[i0];
- Vector3 v1 = vertices[i1];
- Vector3 v2 = vertices[i2];
- bool side0 = cuttingPlane.GetSide(v0);
- bool side1 = cuttingPlane.GetSide(v1);
- bool side2 = cuttingPlane.GetSide(v2);
- if (side0 && side1 && side2)
- {
- AddTriangle(topVertices, topTriangles, v0, v1, v2);
- }
- else if (!side0 && !side1 && !side2)
- {
- AddTriangle(bottomVertices, bottomTriangles, v0, v1, v2);
- }
- }
- return new CutResult
- {
- topMesh = BuildMesh(topVertices, topTriangles),
- bottomMesh = BuildMesh(bottomVertices, bottomTriangles)
- };
- }
- private void AddTriangle(List<Vector3> verts, List<int> tris, Vector3 v0, Vector3 v1, Vector3 v2)
- {
- int baseIndex = verts.Count;
- verts.Add(v0);
- verts.Add(v1);
- verts.Add(v2);
- tris.Add(baseIndex);
- tris.Add(baseIndex + 1);
- tris.Add(baseIndex + 2);
- }
- private Mesh BuildMesh(List<Vector3> vertices, List<int> triangles)
- {
- Mesh mesh = new Mesh();
- mesh.SetVertices(vertices);
- mesh.SetTriangles(triangles, 0);
- mesh.RecalculateNormals();
- mesh.RecalculateBounds();
- return mesh;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment