/// <summary> /// 提供方便方法直接切割TriangleList /// </summary> /// <param name="triangleList"></param> /// <param name="includeSection"></param> /// <param name="includeOppositeFace"></param> /// <returns></returns> public static SlicedMesh SliceTriangleList(List <GeometryUtility.Triangle> triangleList, Plane slicerPlane, bool includeSection, bool includeOppositeFace) { if (triangleList.Count < 1) { return(null); } GeometryUtility.TriangleWindingOrder windingOrder = triangleList[0].WindingOrder; SlicedMesh slicedMesh = new SlicedMesh(windingOrder); for (int i = 0; i < triangleList.Count; ++i) { GeometryUtility.Triangle sliceTriangle = triangleList[i]; GeometryUtility.PlaneTriangleIntersectionResult planeTriangleIntersectionResult = GeometryUtility.GetPlaneTriangleIntersectionResult(slicerPlane, sliceTriangle, includeOppositeFace); if (!planeTriangleIntersectionResult.IsIntersection) { continue; } slicedMesh.UpperMeshTriangleList.AddRange(planeTriangleIntersectionResult.UpperTriangleList); if (includeSection) { slicedMesh.CrossMeshVertexList.AddRange(planeTriangleIntersectionResult.IntersectionPointList); } } return(slicedMesh); }
/// <summary> /// 切割模型 /// </summary> /// <param name="includeSection"></param> /// <param name="includeOppositeFace"></param> /// <param name="remainOrigin">是否保留原始模型</param> /// <returns></returns> public SlicedMesh Slice(bool includeSection, bool includeOppositeFace) { this.m_includeSection = includeSection; this.m_includeOppositeFace = includeOppositeFace; Mesh sliceMesh = this.m_originMesh; GeometryUtility.TriangleWindingOrder meshWindingOrder = GeometryUtility.GetMeshWindingOrder(sliceMesh); SlicedMesh slicedMesh = new SlicedMesh(meshWindingOrder); for (int j = 0; j < sliceMesh.triangles.Length; j += 3) { int vertexIndex0 = sliceMesh.triangles[j]; int vertexIndex1 = sliceMesh.triangles[j + 1]; int vertexIndex2 = sliceMesh.triangles[j + 2]; Vector3 vertexPosition0 = sliceMesh.vertices[vertexIndex0]; Vector3 vertexPosition1 = sliceMesh.vertices[vertexIndex1]; Vector3 vertexPosition2 = sliceMesh.vertices[vertexIndex2]; Vector2 uv0 = Vector2.zero; Vector2 uv1 = Vector2.zero; Vector2 uv2 = Vector2.zero; if (sliceMesh.uv.Length != 0) { uv0 = sliceMesh.uv[vertexIndex0]; uv1 = sliceMesh.uv[vertexIndex1]; uv2 = sliceMesh.uv[vertexIndex2]; } GeometryUtility.Triangle triangle = new GeometryUtility.Triangle(vertexPosition0, vertexPosition1, vertexPosition2, uv0, uv1, uv2); GeometryUtility.PlaneTriangleIntersectionResult intersectionResult = GeometryUtility.GetPlaneTriangleIntersectionResult(this.m_slicerPlane, triangle, includeOppositeFace); slicedMesh.UpperMeshTriangleList.AddRange(intersectionResult.UpperTriangleList); slicedMesh.UnderMeshTriangleList.AddRange(intersectionResult.UnderTriangleList); slicedMesh.CrossMeshVertexList.AddRange(intersectionResult.IntersectionPointList); } this.m_slicedUpperMesh = slicedMesh.UpperMesh; if (includeOppositeFace) { this.m_slicedUnderMesh = slicedMesh.UnderMesh; } //交界处的mesh if (includeSection) { //上交界处的法线是切面的反方向 this.m_slicedUpperCrossMesh = slicedMesh.GetUpperCrossMesh(m_slicerPlane.normal); if (includeOppositeFace) { this.m_slicedUnderCrossMesh = slicedMesh.GetUnderCrossMesh(m_slicerPlane.normal); } } return(slicedMesh); }
/// <summary> /// Debug Plane /// </summary> /// <param name="plane"></param> /// <param name="drawColor"></param> /// <param name="planeSize"></param> /// <param name="clearExist"></param> public void DrawPlane(Plane plane, Color drawColor = default(Color), Vector2 planeSize = default(Vector2), bool clearExist = true) { if (planeSize == default(Vector2)) { planeSize = new Vector2(10f, 10f); } drawColor = drawColor == default(Color) ? defaultColor : drawColor; Quaternion planeRotation = Quaternion.FromToRotation(Vector3.up, plane.normal); Vector3 planeScale = new Vector3(planeSize.x, 0, planeSize.y); Vector3 planeCenterPosition = plane.normal * -plane.distance; //plane.distance 的方向 Matrix4x4 planeMatrix = Matrix4x4.TRS(planeCenterPosition, planeRotation, planeScale); GeometryUtility.Triangle triangle0 = new GeometryUtility.Triangle(new Vector3(-0.5f, 0, 0.5f), new Vector3(0.5f, 0, 0.5f), new Vector3(-0.5f, 0, -0.5f)); triangle0.ApplyMatrix(planeMatrix); GeometryUtility.Triangle triangle1 = new GeometryUtility.Triangle(new Vector3(0.5f, 0, 0.5f), new Vector3(0.5f, 0, -0.5f), new Vector3(-0.5f, 0, -0.5f)); triangle1.ApplyMatrix(planeMatrix); GeometryUtility.Triangle backTriangle0 = triangle0.Clone() as GeometryUtility.Triangle; backTriangle0.WindingOrder = GeometryUtility.TriangleWindingOrder.ClockWise; GeometryUtility.Triangle backTriangle1 = triangle1.Clone() as GeometryUtility.Triangle; backTriangle1.WindingOrder = GeometryUtility.TriangleWindingOrder.ClockWise; Mesh mesh = GeometryUtility.CreateUnityMeshByTriangleList(new List <GeometryUtility.Triangle>() { triangle0, triangle1 }); Mesh meshBackFace = GeometryUtility.CreateUnityMeshByTriangleList(new List <GeometryUtility.Triangle>() { backTriangle0, backTriangle1 }); if (clearExist) { m_gizmosMeshList.Clear(); } m_gizmosMeshList.Add(new GizmosMesh(mesh, defaultColor)); m_gizmosMeshList.Add(new GizmosMesh(meshBackFace, new Color(0f, 1f, 0f, 0.5f))); }