using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// 烘焙的缝合线 /// public class UnitAlgorithmSutureBaking : UnitAlgorithm { /// 烘焙的缝合线 public UnitAlgorithmSutureBaking() { } public void Compute(DataSutureSide sutureSide) { AllVertexs(sutureSide); //缝合范围内的顶点 SetVertex(sutureSide); //顶点转换位置 SetPositions(sutureSide); } /// 顶点距离数据 private List GetVertex(DataPlateVertex[] vertexsArray, bool isReversal) { float length = 0; List vertexs = new List(); List sideVertexs = new List(vertexsArray); if (isReversal) { sideVertexs.Reverse(); } for (int i = 0; i < sideVertexs.Count - 1; i++) { DataSutureSideVertex vertex = new DataSutureSideVertex(length, sideVertexs[i], sideVertexs[i + 1]); vertexs.Add(vertex); length += vertex.Distance; } return vertexs; } /// 全部顶点 private void AllVertexs(DataSutureSide sutureSide) { DataPlateVertex[] vertexsArray = sutureSide.plateSide.dataBaking.vertexs; List allVertexs = GetVertex(vertexsArray, false); sutureSide.dataBaking.allVertexs = allVertexs.ToArray(); } /// 缝合范围内的顶点 private void SetVertex(DataSutureSide sutureSide) { //全部顶点 List allVertexs = GetVertex(sutureSide.plateSide.dataBaking.vertexs, sutureSide.isReversal); //缝合范围内的顶点 float maxLength = sutureSide.suture.length; List vertexs = new List(); for (int i = 0; i < allVertexs.Count; i++) { if (allVertexs[i].origin <= maxLength) { vertexs.Add(allVertexs[i]); } } sutureSide.dataBaking.vertexs = vertexs.ToArray(); } /// 顶点转换位置 private void SetPositions(DataSutureSide sutureSide) { Vector3 platePosition = sutureSide.plateSide.plate.dataBaking.position; Vector3 plateEulerAngles = sutureSide.plateSide.plate.dataBaking.eulerAngles; List positions = new List(); DataSutureSideVertex[] vertexs = sutureSide.dataBaking.vertexs; for (int i = 0; i < vertexs.Length; i++) { Quaternion quaternion = Quaternion.Euler(plateEulerAngles); Vector3 baking = quaternion * vertexs[i].a.position; Vector3 position = baking + platePosition; positions.Add(position); } sutureSide.dataBaking.positions = positions.ToArray(); } }