Eonirr

Untitled

Apr 6th, 2025
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.23 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3.  
  4. public class MoellonCutter
  5. {
  6. public struct CutResult
  7. {
  8. public Mesh topMesh;
  9. public Mesh bottomMesh;
  10. }
  11.  
  12. public CutResult Cut(Mesh originalMesh, Vector3 planePoint, Vector3 planeNormal)
  13. {
  14. List<Vector3> topVertices = new List<Vector3>();
  15. List<int> topTriangles = new List<int>();
  16. List<Vector3> bottomVertices = new List<Vector3>();
  17. List<int> bottomTriangles = new List<int>();
  18.  
  19. Vector3[] vertices = originalMesh.vertices;
  20. int[] triangles = originalMesh.triangles;
  21. Plane cuttingPlane = new Plane(planeNormal.normalized, planePoint);
  22.  
  23. for (int i = 0; i < triangles.Length; i += 3)
  24. {
  25. int i0 = triangles[i];
  26. int i1 = triangles[i + 1];
  27. int i2 = triangles[i + 2];
  28.  
  29. Vector3 v0 = vertices[i0];
  30. Vector3 v1 = vertices[i1];
  31. Vector3 v2 = vertices[i2];
  32.  
  33. bool side0 = cuttingPlane.GetSide(v0);
  34. bool side1 = cuttingPlane.GetSide(v1);
  35. bool side2 = cuttingPlane.GetSide(v2);
  36.  
  37. if (side0 && side1 && side2)
  38. {
  39. AddTriangle(topVertices, topTriangles, v0, v1, v2);
  40. }
  41. else if (!side0 && !side1 && !side2)
  42. {
  43. AddTriangle(bottomVertices, bottomTriangles, v0, v1, v2);
  44. }
  45. }
  46.  
  47. return new CutResult
  48. {
  49. topMesh = BuildMesh(topVertices, topTriangles),
  50. bottomMesh = BuildMesh(bottomVertices, bottomTriangles)
  51. };
  52. }
  53.  
  54. private void AddTriangle(List<Vector3> verts, List<int> tris, Vector3 v0, Vector3 v1, Vector3 v2)
  55. {
  56. int baseIndex = verts.Count;
  57. verts.Add(v0);
  58. verts.Add(v1);
  59. verts.Add(v2);
  60. tris.Add(baseIndex);
  61. tris.Add(baseIndex + 1);
  62. tris.Add(baseIndex + 2);
  63. }
  64.  
  65. private Mesh BuildMesh(List<Vector3> vertices, List<int> triangles)
  66. {
  67. Mesh mesh = new Mesh();
  68. mesh.SetVertices(vertices);
  69. mesh.SetTriangles(triangles, 0);
  70. mesh.RecalculateNormals();
  71. mesh.RecalculateBounds();
  72. return mesh;
  73. }
  74. }
  75.  
Advertisement
Add Comment
Please, Sign In to add comment