Example #1
0
    void OnDrawGizmos()
    {
        if (nd == null)
        {
            return;
        }

        plane.ComputePlane(nd.transform.position, nd.transform.forward);

        Vector3 nSize = Vector3.one / 2.0f;

        List <Vector3> upper        = new List <Vector3>();
        List <Vector3> lower        = new List <Vector3>();
        List <Vector3> intersection = new List <Vector3>();

        plane.IntersectTriangleHull(pt1.transform.position, pt2.transform.position, pt3.transform.position, upper, lower, intersection);

        if (drawPoints)
        {
            Gizmos.color = Color.yellow;

            Gizmos.DrawWireCube(pt1.transform.position, Vector3.one);
            Gizmos.DrawWireCube(pt2.transform.position, Vector3.one);
            Gizmos.DrawWireCube(pt3.transform.position, Vector3.one);

            Gizmos.color = Color.green;

            foreach (Vector3 v in upper)
            {
                Gizmos.DrawCube(v, nSize);
            }

            Gizmos.color = Color.blue;

            foreach (Vector3 v in lower)
            {
                Gizmos.DrawCube(v, nSize);
            }

            Gizmos.color = Color.red;

            foreach (Vector3 v in intersection)
            {
                Gizmos.DrawCube(v, nSize);
            }
        }

        if (drawTriangles)
        {
            upper.AddRange(intersection);
            lower.AddRange(intersection);

            List <int> indices = new List <int>();

            Triangulator.TriangulateNDSlice(upper, indices);

            Gizmos.color = Color.green;

            for (int i = 0; i < indices.Count; i += 3)
            {
                Gizmos.DrawLine(upper[indices[i]], upper[indices[i + 1]]);
                Gizmos.DrawLine(upper[indices[i + 1]], upper[indices[i + 2]]);
                Gizmos.DrawLine(upper[indices[i + 2]], upper[indices[i]]);
            }

            Gizmos.color = Color.blue;
            indices.Clear();

            Triangulator.TriangulateNDSlice(lower, indices);

            for (int i = 0; i < indices.Count; i += 3)
            {
                Gizmos.DrawLine(lower[indices[i]], lower[indices[i + 1]]);
                Gizmos.DrawLine(lower[indices[i + 1]], lower[indices[i + 2]]);
                Gizmos.DrawLine(lower[indices[i + 2]], lower[indices[i]]);
            }
        }
    }
Example #2
0
    private void Split()
    {
        NDPlane plane = new NDPlane();

        plane.ComputePlane((mpta + mptb + mptc) / 3, RandomVector3());

        List <Vector3> upper        = new List <Vector3>();
        List <Vector3> lower        = new List <Vector3>();
        List <Vector3> intersection = new List <Vector3>();

        plane.IntersectTriangleHull(mpta, mptb, mptc, upper, lower, intersection);

        upper.AddRange(intersection);
        lower.AddRange(intersection);

        List <int> indices = new List <int>();

        // UPPER HULL
        Triangulator.TriangulateNDSlice(upper, indices);

        for (int i = 0; i < indices.Count; i += 3)
        {
            RenderTriangle tri = new RenderTriangle();

            Vector3 pta = upper[indices[i]];
            Vector3 ptb = upper[indices[i + 1]];
            Vector3 ptc = upper[indices[i + 2]];

            Vector2 uva = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref pta);
            Vector2 uvb = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref ptb);
            Vector2 uvc = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref ptc);

            tri.SetPoints(pta, ptb, ptc);
            tri.SetUV(uva, uvb, uvc);

            splits.Add(tri);
        }

        indices.Clear();

        // LOWER HULL
        Triangulator.TriangulateNDSlice(lower, indices);

        for (int i = 0; i < indices.Count; i += 3)
        {
            RenderTriangle tri = new RenderTriangle();

            Vector3 pta = lower[indices[i]];
            Vector3 ptb = lower[indices[i + 1]];
            Vector3 ptc = lower[indices[i + 2]];

            Vector2 uva = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref pta);
            Vector2 uvb = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref ptb);
            Vector2 uvc = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref ptc);

            tri.SetPoints(pta, ptb, ptc);
            tri.SetUV(uva, uvb, uvc);

            splits.Add(tri);
        }
    }