| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using Sirenix.OdinInspector;
- public class MeshSelection : MonoBehaviour
- {
- [DetailedInfoBox("使用说明", "1、选择要修改的物体\n2、点击开始选择,然后“ctrl+左键”选择网格上的面,选择完毕后点击生成\n3、选择第二个面进行生成点位\n4、点击生成中心点")]
- [LabelText("需要修改的物体")]
- public GameObject ToolSelectObj;
- [HideInInspector]
- public List<int> SelectedTrianglesIndex = new List<int>();
- [HideInInspector]
- public HashSet<Vector3> TrianglesVector3s = new HashSet<Vector3>();
- [LabelText("第一个点位")]
- [ShowIf("showF"), ReadOnly]
- public GameObject firstObj;
- [LabelText("第二个点位")]
- [ShowIf("showS"),ReadOnly]
- public GameObject SecondObj;
- bool showF = false;
- bool showS = false;
- bool showC = false;
- public void GetBoundaryVertices(Mesh mesh)
- {
- Vector3[] vertices = mesh.vertices;
- int[] triangles = mesh.triangles;
- Dictionary<(int, int), int> edgeFaces = new Dictionary<(int, int), int>();
- foreach (var i in SelectedTrianglesIndex)
- {
- int a = triangles[i];
- int b = triangles[i + 1];
- int c = triangles[i + 2];
- RegisterEdge(a, b, edgeFaces);
- RegisterEdge(b, c, edgeFaces);
- RegisterEdge(c, a, edgeFaces);
-
- }
- foreach (var edge in edgeFaces)
- {
- if (edge.Value == 1)
- {
- TrianglesVector3s.Add(ToolSelectObj.transform.TransformPoint(vertices[edge.Key.Item1]));
- TrianglesVector3s.Add(ToolSelectObj.transform.TransformPoint(vertices[edge.Key.Item2]));
- }
- }
- }
- private static void RegisterEdge(int a, int b, Dictionary<(int, int), int> edgeFaces)
- {
- var edge = a < b ? (a, b) : (b, a);
- edgeFaces.TryGetValue(edge, out int count);
- edgeFaces[edge] = count + 1;
- }
- public void CreateCenter()
- {
- Vector3 v3 = Vector3.zero;
- foreach(Vector3 vector3 in TrianglesVector3s)
- {
- v3 += vector3;
- }
- if(firstObj == null)
- {
- firstObj = new GameObject();
- firstObj.transform.SetParent(ToolSelectObj.transform.parent, true);
- firstObj.transform.position = v3 / TrianglesVector3s.Count;
- firstObj.name = ToolSelectObj.name + "-第一个生成点";
- showF = true;
- TrianglesVector3s.Clear();
- if (showF && showS) showC = true;
- return;
- }
- if (SecondObj == null)
- {
- SecondObj = new GameObject();
- SecondObj.transform.SetParent(ToolSelectObj.transform.parent, true);
- SecondObj.transform.position = v3 / TrianglesVector3s.Count;
- SecondObj.name = ToolSelectObj.name + "-第二个生成点";
- showS = true;
- TrianglesVector3s.Clear();
- if (showF && showS) showC = true;
- return;
- }
- }
- [Button("生成中心点")]
- [ShowIf("showC")]
- public void CreateCenterObj()
- {
- GameObject obj = new GameObject();
- obj.transform.SetParent(ToolSelectObj.transform.parent, true);
- obj.transform.position = (firstObj.transform.position + SecondObj.transform.position) / 2;
- obj.transform.rotation = Quaternion.LookRotation( (firstObj.transform.position - SecondObj.transform.position).normalized);
- obj.name = ToolSelectObj.name + "---生成点";
- ToolSelectObj.transform.SetParent(obj.transform);
- DestroyImmediate(firstObj);
- DestroyImmediate(SecondObj);
- showC= showF = showS = false;
- TrianglesVector3s.Clear();
- }
- }
|