Exemplo n.º 1
0
    //切割 之 未切割到顶点

    private void CutNoVert(float vert1, float vert2, float vert3, OneTriangleData buffe)
    {
        bool    isSingleVertOnCutNormal;    //单顶点,是否在切割法线边
        Vector3 leftCutPos, rightCutPos;
        int     leftCutIndex, rightCutIndex;
        int     singleVertIndex, leftVertIndex, rightVertIndex;

        // 四边形切:从 单顶点的左顶点 切。
        if (vert2 * vert3 > 0)               //23共边,1独
        {
            leftCutPos      = CutLine(buffe.vertP1, buffe.vertP2);
            rightCutPos     = CutLine(buffe.vertP1, buffe.vertP3);
            singleVertIndex = buffe.index1;
            leftVertIndex   = buffe.index2;
            rightVertIndex  = buffe.index3;

            if (vert1 > 0)
            {
                isSingleVertOnCutNormal = true;
            }
            else
            {
                isSingleVertOnCutNormal = false;
            }
        }
        else if (vert1 * vert3 > 0)     //13共 ,2独
        {
            leftCutPos      = CutLine(buffe.vertP2, buffe.vertP3);
            rightCutPos     = CutLine(buffe.vertP2, buffe.vertP1);
            singleVertIndex = buffe.index2;
            leftVertIndex   = buffe.index3;
            rightVertIndex  = buffe.index1;

            if (vert2 > 0)
            {
                isSingleVertOnCutNormal = true;
            }
            else
            {
                isSingleVertOnCutNormal = false;
            }
        }
        else                            //12g共,3独
        {
            leftCutPos      = CutLine(buffe.vertP3, buffe.vertP1);
            rightCutPos     = CutLine(buffe.vertP3, buffe.vertP2);
            singleVertIndex = buffe.index3;
            leftVertIndex   = buffe.index1;
            rightVertIndex  = buffe.index2;

            if (vert3 > 0)
            {
                isSingleVertOnCutNormal = true;
            }
            else
            {
                isSingleVertOnCutNormal = false;
            }
        }

        allPoint.Add(leftCutPos);
        leftCutIndex = allPoint.Count - 1;
        allPoint.Add(rightCutPos);
        rightCutIndex = allPoint.Count - 1;

        if (isSingleVertOnCutNormal)
        {
            AddTriangToTempList1(singleVertIndex, leftCutIndex, rightCutIndex, tempVert1, tempNormal1, triangles1, pointIndex1, otherPointIndex1);
            AddTriangToTempList1(leftVertIndex, rightCutIndex, leftCutIndex, tempVert2, tempNormal2, triangles2, pointIndex2, otherPointIndex2);
            AddTriangToTempList2(leftVertIndex, rightVertIndex, rightCutIndex, tempVert2, tempNormal2, triangles2, pointIndex2, otherPointIndex2);
        }
        else
        {
            AddTriangToTempList1(singleVertIndex, leftCutIndex, rightCutIndex, tempVert2, tempNormal2, triangles2, pointIndex2, otherPointIndex2);
            AddTriangToTempList1(leftVertIndex, rightCutIndex, leftCutIndex, tempVert1, tempNormal1, triangles1, pointIndex1, otherPointIndex1);
            AddTriangToTempList2(leftVertIndex, rightVertIndex, rightCutIndex, tempVert1, tempNormal1, triangles1, pointIndex1, otherPointIndex1);
        }
    }
Exemplo n.º 2
0
    //切割到顶点时:
    private void CutInVert(float vert1, float vert2, float vert3, OneTriangleData buffe)
    {
        Vector3 cutPos;
        //1 表示法线边
        int cutIndex, leftIndex1, leftIndex2, rightIndex1, rightIndex2;

        if (vert1 == 0)          //切割到顶点1
        {
            cutPos = CutLine(buffe.vertP2, buffe.vertP3);

            if (vert2 > 0)
            {
                leftIndex1  = buffe.index1;
                rightIndex1 = buffe.index2;
                leftIndex2  = buffe.index3;
                rightIndex2 = buffe.index1;
            }
            else
            {
                leftIndex2  = buffe.index1;
                rightIndex2 = buffe.index2;
                leftIndex1  = buffe.index3;
                rightIndex1 = buffe.index1;
            }
        }
        else if (vert2 == 0)        //切割到顶点2
        {
            cutPos = CutLine(buffe.vertP1, buffe.vertP3);

            if (vert1 > 0)
            {
                leftIndex1  = buffe.index1;
                rightIndex1 = buffe.index2;
                leftIndex2  = buffe.index2;
                rightIndex2 = buffe.index3;
            }
            else
            {
                leftIndex2  = buffe.index1;
                rightIndex2 = buffe.index2;
                leftIndex1  = buffe.index2;
                rightIndex1 = buffe.index3;
            }
        }
        else                        ////切割到顶点3
        {
            cutPos = CutLine(buffe.vertP2, buffe.vertP1);

            if (vert1 > 0)
            {
                leftIndex1  = buffe.index3;
                rightIndex1 = buffe.index1;
                leftIndex2  = buffe.index2;
                rightIndex2 = buffe.index3;
            }
            else
            {
                leftIndex2  = buffe.index3;
                rightIndex2 = buffe.index1;
                leftIndex1  = buffe.index2;
                rightIndex1 = buffe.index3;
            }
        }
        allPoint.Add(cutPos);
        cutIndex = allPoint.Count - 1;
        AddTriangToTempList2(leftIndex1, rightIndex1, cutIndex, tempVert1, tempNormal1, triangles1, pointIndex1, otherPointIndex1);
        AddTriangToTempList2(leftIndex2, rightIndex2, cutIndex, tempVert2, tempNormal2, triangles2, pointIndex2, otherPointIndex2);
    }