Esempio n. 1
0
    /// <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);
    }
Esempio n. 2
0
    /// <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);
    }
Esempio n. 3
0
    /// <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)));
    }