Пример #1
0
    static Rhino.Geometry.Mesh[] GenerateRhinoMesh(List <List <Vector3> > nestedPt)
    {
        var crvs = new List <Rhino.Geometry.Curve>();
        var pts  = new List <Rhino.Geometry.Point3d>();

        for (int i = 0; i < nestedPt.Count; i++)
        {
            for (int j = 0; j < nestedPt[i].Count; j++)
            {
                var pt = new Rhino.Geometry.Point3d(nestedPt[i][j].x, nestedPt[i][j].z, nestedPt[i][j].y);
                pts.Add(pt);
            }
            var crv = CurveCompute.CreateInterpolatedCurve(pts.ToArray(), 3);
            crvs.Add(crv);
        }
        int err;
        var srf = NurbsSurfaceCompute.CreateNetworkSurface(crvs, 0, 0.001, 0.001, 0.001, out err);

        if (err > 0)
        {
            Debug.Log("failed to generate surface network");
        }
        var brep = srf.ToBrep();
        var mesh = MeshCompute.CreateFromBrep(brep);

        return(mesh);
    }
    // Start is called before the first frame update
    void Start()
    {
        ComputeServer.AuthToken = authToken;

        var model  = new Rhino.FileIO.File3dm();
        var curves = new List <Rhino.Geometry.NurbsCurve>();

        for (int i = 0; i < 20; i++)
        {
            var s  = 10f;
            var pt = new Rhino.Geometry.Point3d(Random.Range(-s, s), Random.Range(-s, s), 0);
            // model.Objects.AddPoint(pt);
            var r      = Random.Range(1f, 3f);
            var circle = new Rhino.Geometry.Circle(pt, r);
            var curve  = circle.ToNurbsCurve();
            curves.Add(curve);
        }

        var unionCrvsC = CurveCompute.CreateBooleanUnion(curves);

        var height     = Random.Range(1f, 5f);
        var extrusions = new List <Rhino.Geometry.Extrusion>();

        foreach (var unionCrvC in unionCrvsC)
        {
            var extrusion = Rhino.Geometry.Extrusion.Create(unionCrvC, height, true);
            model.Objects.AddExtrusion(extrusion);
            extrusions.Add(extrusion);
        }

        var meshList = new List <Rhino.Geometry.Mesh>();

        foreach (var extrusion in extrusions)
        {
            var brep   = extrusion.ToBrep();
            var meshes = MeshCompute.CreateFromBrep(brep);
            meshList.AddRange(meshes.ToList());
        }

        foreach (var mesh in meshList)
        {
            Mesh meshObj = new Mesh();

            var vertices = new List <Vector3>();
            // mesh.RebuildNormals();
            foreach (var meshVertex in mesh.Vertices)
            {
                var vertex = new Vector3(meshVertex.X, meshVertex.Z, meshVertex.Y);
                vertices.Add(vertex);
            }

            var triangles = new List <int>();
            foreach (var meshFace in mesh.Faces)
            {
                if (meshFace.IsTriangle)
                {
                    triangles.Add(meshFace.C);
                    triangles.Add(meshFace.B);
                    triangles.Add(meshFace.A);
                }
                else if (meshFace.IsQuad)
                {
                    triangles.Add(meshFace.C);
                    triangles.Add(meshFace.B);
                    triangles.Add(meshFace.A);
                    triangles.Add(meshFace.D);
                    triangles.Add(meshFace.C);
                    triangles.Add(meshFace.A);
                }
            }


            meshObj.vertices  = vertices.ToArray();
            meshObj.triangles = triangles.ToArray();


            meshObj.RecalculateNormals();

            GameObject gb = new GameObject();
            gb.AddComponent <MeshFilter>().mesh       = meshObj;
            gb.AddComponent <MeshRenderer>().material = mat;
        }


        var path = Application.dataPath + "/../Outputs/model.3dm";

        model.Write(path, 5);
    }