示例#1
0
    private void GenerateBuilding(Vector3[] vertices, float height)
    {
        var isClockwise = SimCoordinatesUtils.PolygonIsClockwise(vertices);

        Mesh       newMesh  = new Mesh();
        GameObject building = new GameObject("Building");
        GameObject shapes   = new GameObject("Shapes");

        building.transform.parent   = mainObject.transform;
        building.transform.position = mainObject.transform.position;
        shapes.transform.parent     = building.transform;

        shapes.AddComponent <MeshFilter>();
        shapes.AddComponent <MeshRenderer>();
        shapes.transform.position = new Vector3(0, 0, 0);
        shapes.GetComponent <MeshFilter>().mesh       = newMesh;
        shapes.GetComponent <MeshRenderer>().material = this.material;

        CombineInstance[] combine          = new CombineInstance[vertices.Length];
        Vector3[]         extrudedVertices = new Vector3[vertices.Length];
        int[]             triangles;

        for (int i = 0; i < vertices.Length; i++)
        {
            extrudedVertices[i] = new Vector3(vertices[i].x, vertices[i].y + height, vertices[i].z);

            if (i > 0)
            {
                if (isClockwise)
                {
                    triangles = new int[6] {
                        0, 2, 1, 2, 3, 1
                    };
                }
                else
                {
                    triangles = new int[6] {
                        0, 1, 2, 2, 1, 3
                    };
                }
                Mesh face = new Mesh
                {
                    vertices  = new Vector3[] { vertices[i - 1], extrudedVertices[i - 1], vertices[i], extrudedVertices[i] },
                    triangles = triangles,
                };

                combine[i - 1].mesh      = face;
                combine[i - 1].transform = building.transform.localToWorldMatrix;
            }
        }

        combine[vertices.Length - 1].mesh      = GenerateRoof(extrudedVertices);
        combine[vertices.Length - 1].transform = building.transform.localToWorldMatrix;

        newMesh.CombineMeshes(combine);
        newMesh.RecalculateNormals();
    }
示例#2
0
    public void CreateEnvironment(Coords worldPoint, int worldRadius, Vector3 editorPoint, float height, int editorRadius)
    {
        SetupGOInstance(editorPoint);

        var square    = CoordinatesUtils.SquareFromCenter((worldPoint.Latitude, worldPoint.Longitude), worldRadius);
        var squareSim = CoordinatesUtils.SquareFromCenterSim(new Vector3(0, 0, 0), editorRadius);
        var tile      = new Tile(square[2], square[0], squareSim[2], squareSim[0]);

        // Retrieve data from API only if necessary
        var data = SessionState.GetString("prev_environment", "");

        if (SettingsHaveChanged(worldPoint, worldRadius, height) == true)
        {
            SessionState.SetFloat("prev_latitude", worldPoint.Latitude);
            SessionState.SetFloat("prev_longitude", worldPoint.Longitude);
            SessionState.SetInt("prev_radius", worldRadius);
            SessionState.SetFloat("prev_editor_heigh", height);
            data = Overpass.GetBuildingsInArea(tile);
        }

        var dataObj = JsonConvert.DeserializeObject <DataProperties>(data);

        SessionState.SetString("prev_environment", data);

        foreach (Elements elem in dataObj.elements)
        {
            Vector3[] points = new Vector3[elem.geometry.Length];

            for (int i = 0; i < elem.geometry.Length; i++)
            {
                Coords  geoPoint = new Coords(elem.geometry[i].lat, elem.geometry[i].lon);
                Vector3 simPoint = SimCoordinatesUtils.GPSToSim(geoPoint, tile);

                points[i] = simPoint;
            }

            GenerateBuilding(points, height);
        }
    }