Beispiel #1
0
    private void CreateRoad(WayStruct str)
    {
        if (str.tags[0].value == "yes")
        {
            return;
        }

        GameObject go = new GameObject($"highway_{str.tags[0].value}_{str.id.ToString()}");

        go.AddComponent <LineRenderer>();

        var mf = go.GetComponent <LineRenderer>();

        float roadWidth = .1f;

        switch (str.tags[0].value)
        {
        case "service":
            roadWidth = 0.1f;
            break;

        case "sidewalk":
        case "footway":
            roadWidth = .05f;
            break;

        case "residental":
            roadWidth = 1f;
            break;
        }

        Vector2[] points = str.nodes.Select(x => x.position).ToArray();
        points = points.Take(points.Length - 1).ToArray();
        Vector2 scaleVec = new Vector2(10000, 10000);

        for (int n = 0; n < points.Length; n++)
        {
            points[n] = new Vector2((points[n].x - minlat) * -1f, points[n].y - minlon);
            points[n].Scale(scaleVec);
        }
        Vector3[] vec3d = new Vector3[points.Length];
        for (int i = 0; i < vec3d.Length; i++)
        {
            vec3d[i] = new Vector3(points[i].x, 0, points[i].y);
        }
        mf.positionCount = vec3d.Length;
        mf.SetPositions(vec3d);
        mf.startWidth = roadWidth;
        mf.endWidth   = roadWidth;
    }
Beispiel #2
0
    private void CreateBuilding(WayStruct str)
    {
        GameObject go = new GameObject($"building_{str.id.ToString()}");

        go.AddComponent <MeshFilter>();
        go.AddComponent <MeshRenderer>();

        var  mf   = go.GetComponent <MeshFilter>();
        Mesh mesh = new Mesh();

        mf.mesh = mesh;


        Vector2[] points = str.nodes.Select(x => x.position).ToArray();
        points = points.Take(points.Length - 1).ToArray();
        Vector2 scaleVec = new Vector2(10000, 10000);

        for (int n = 0; n < points.Length; n++)
        {
            points[n] = new Vector2((points[n].x - minlat) * -1f, points[n].y - minlon);
            points[n].Scale(scaleVec);
        }
        Triangulator tr = new Triangulator(points);

        int[]     indices = tr.Triangulate();
        Vector3[] vec3d   = new Vector3[points.Length];
        for (int i = 0; i < vec3d.Length; i++)
        {
            vec3d[i] = new Vector3(points[i].x, 0, points[i].y);
        }

        mesh.vertices  = vec3d;
        mesh.triangles = indices;
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();
        go.GetComponent <MeshRenderer>().material = buildingMaterial;
    }