MeshSelection.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class MeshSelection : MonoBehaviour
  5. {
  6. private GameObject ToolSelectObj;
  7. public List<int> SelectedTrianglesIndex = new List<int>();
  8. public HashSet<Vector3> TrianglesVector3s = new HashSet<Vector3>();
  9. public void GetBoundaryVertices(Mesh mesh)
  10. {
  11. Vector3[] vertices = mesh.vertices;
  12. int[] triangles = mesh.triangles;
  13. Dictionary<(int, int), int> edgeFaces = new Dictionary<(int, int), int>();
  14. foreach (var i in SelectedTrianglesIndex)
  15. {
  16. int a = triangles[i];
  17. int b = triangles[i + 1];
  18. int c = triangles[i + 2];
  19. RegisterEdge(a, b, edgeFaces);
  20. RegisterEdge(b, c, edgeFaces);
  21. RegisterEdge(c, a, edgeFaces);
  22. }
  23. foreach (var edge in edgeFaces)
  24. {
  25. if (edge.Value == 1)
  26. {
  27. TrianglesVector3s.Add(ToolSelectObj.transform.TransformPoint(vertices[edge.Key.Item1]));
  28. TrianglesVector3s.Add(ToolSelectObj.transform.TransformPoint(vertices[edge.Key.Item2]));
  29. }
  30. }
  31. }
  32. private static void RegisterEdge(int a, int b, Dictionary<(int, int), int> edgeFaces)
  33. {
  34. var edge = a < b ? (a, b) : (b, a);
  35. edgeFaces.TryGetValue(edge, out int count);
  36. edgeFaces[edge] = count + 1;
  37. }
  38. public void CreateCenter()
  39. {
  40. Vector3 v3 = Vector3.zero;
  41. foreach(Vector3 vector3 in TrianglesVector3s)
  42. {
  43. GameObject gameObject = new GameObject();
  44. gameObject.transform.position = vector3;
  45. v3 += vector3;
  46. }
  47. GameObject obj = new GameObject();
  48. obj.transform.SetParent(ToolSelectObj.transform.parent, true);
  49. obj.transform.localPosition = v3 / TrianglesVector3s.Count ;
  50. obj.name = ToolSelectObj.name+"---生成点";
  51. //ToolSelectObj.transform.SetParent(obj.transform,true);
  52. TrianglesVector3s.Clear();
  53. }
  54. public void setObj(GameObject obj)
  55. {
  56. ToolSelectObj = obj;
  57. }
  58. }