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; }
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; }