/** * Změna Y souřadnice stěn na hodnotu výšky terénu */ private List <Vector3> GetGroundEdges(ThreeDimObject threeDimObject) { TerrainHeight = TerrainUtils.MapTopValue + 1f; var biggestTerrainHeight = 0f; var localCoordinates = threeDimObject.XyzCoordinates; foreach (var localCoordinate in localCoordinates) { var tempHeight = TerrainRender.Get().Terrain.SampleHeight(localCoordinate); //get biggest terrain height if (tempHeight > biggestTerrainHeight) { biggestTerrainHeight = tempHeight; } //get lowest terrain height if (tempHeight < TerrainHeight) { TerrainHeight = tempHeight; } } //no coordinates, set default value if (TerrainHeight == TerrainUtils.MapTopValue + 1f) { TerrainHeight = 0f; } var groundEdges = new List <Vector3>(); foreach (var localCoordinate in localCoordinates) { var v = localCoordinate; v.y = TerrainHeight; groundEdges.Add(v); } //save biggest terrain height for roof edges TerrainHeight = biggestTerrainHeight; return(groundEdges); }
/** * Create trees on the terrain */ public void GenerateTrees(LatLngObject middleMapPoint, List <TreeObject> trees) { Vector3 middleMapXyz; ConiferousTree = Resources.Load("3DObjects/Trees/Prefabs/Fir_Tree", typeof(GameObject)) as GameObject; LeafyTree = Resources.Load("3DObjects/Trees/Prefabs/Poplar_Tree", typeof(GameObject)) as GameObject; //default position, if map does not contain any building or road if (middleMapPoint.Equals(new LatLngObject())) { middleMapXyz = Vector3.zero; } else { middleMapXyz = Converter.ConvertLatLngToXyz(middleMapPoint); } var treeCount = Main.Settings.NumberOfTrees; const float treeScale = 0.06f; var terrain = TerrainRender.Get().Terrain; var random = new Random(); //GENERATE RANDOM TREE POSITIONS if (trees.Count == 0) { for (var i = 0; i < treeCount; i++) { var decimalRandomPartX = random.NextDouble(); var decimalRandomPartZ = random.NextDouble(); const int limitX = (TerrainUtils.MapWidth / 2) - 2; const int limitZ = (TerrainUtils.MapHeight / 2) - 2; var randomX = random.Next((int)(middleMapXyz.x - limitX), (int)(middleMapXyz.x + limitX)); // + 2 a + 1 kvuli korekcim umisteni na hranice terenu var randomZ = random.Next((int)(middleMapXyz.z - limitZ + 2), (int)(middleMapXyz.z + limitZ + 1)); var randomDecX = (float)(randomX + decimalRandomPartX); var randomDecZ = (float)(randomZ + decimalRandomPartZ); var randomPos = new Vector3(randomDecX, 0, randomDecZ); var terrainY = terrain.SampleHeight(randomPos); randomPos.y = terrainY; var randNumberTree = random.Next(0, 2); if (!IsPointInCollision(randomPos)) { GameObject tree; switch (randNumberTree) { case 0: tree = Instantiate(LeafyTree); break; default: tree = Instantiate(ConiferousTree); break; } var treeTransform = tree.transform; treeTransform.position = randomPos; treeTransform.localScale = new Vector3(treeScale, treeScale, treeScale); } else { --i; } } } //CUSTOM TREE POSITIONS else { foreach (var currentTree in trees) { var treePos = Converter.ConvertLatLngToXyz(currentTree.LatLngCoordinate); //if tree is outside the map if (TerrainUtils.IsObjectOutsideMap(treePos, middleMapXyz)) { continue; } //set y position from terrain var terrainY = terrain.SampleHeight(treePos); treePos.y = terrainY; var randNumberTree = random.Next(0, 2); GameObject tree; switch (randNumberTree) { case 0: tree = Instantiate(LeafyTree); break; default: tree = Instantiate(ConiferousTree); break; } var treeTransform = tree.transform; treeTransform.position = treePos; treeTransform.localScale = new Vector3(treeScale, treeScale, treeScale); } } }
/** * Render roads */ public void Render(LatLngObject mapMiddleMapPoint, Transform cameraTransform, List <RoadObject> roads) { if (roads.Count == 0) { return; } var middleMapPoint = Converter.ConvertLatLngToXyz(mapMiddleMapPoint); //save into global variable Roads = roads; var terrain = TerrainRender.Get().Terrain; //render roads for (var i = 0; i < roads.Count; i++) { var ySize = 1; var roadPointInXyz = new Vector3[roads[i].LatLngCoordinates.Count]; if (roadPointInXyz.Length == 0) { continue; } //convert road point from LatLng to Xyz coordination's; Y coordinate values set as terrain height for (var j = 0; j < roadPointInXyz.Length; j++) { roadPointInXyz[j] = Converter.ConvertLatLngToXyz(roads[i].LatLngCoordinates[j]); //pricteni hodnoty navic proti prolinani s terenem roadPointInXyz[j].y = terrain.SampleHeight(roadPointInXyz[j]) + 0.03f; } //road starts outside terrain => reverse points if (TerrainUtils.IsObjectOutsideMap(roadPointInXyz[0], middleMapPoint)) { Array.Reverse(roadPointInXyz); } //points of road for (var j = 0; j < roadPointInXyz.Length; j++) { var roadPoint = roadPointInXyz[j]; //pokud je mezi dvěma body cesty rozdíl větší než 1 if (j == 0 || Math.Abs(roadPoint.x - roadPointInXyz[j - 1].x) >= 1 || Math.Abs(roadPoint.z - roadPointInXyz[j - 1].z) >= 1) { continue; } //snižovat souřadnici Y cesty, pokud je za hranou terénu (efekt padání cesty) if (TerrainUtils.IsObjectOutsideMap(roadPoint, middleMapPoint)) { roadPointInXyz[j].y -= ySize; ySize++; } } //vytvoreni cesty(nastaveni barvy, pozic, poctu pozic...) CreateRoadObject(roads, roadPointInXyz, i); //set cars for road type var carRoads = new[] { RoadUtils.Secondary }; var vehicleTypes = new[] { RoadUtils.VehicleTram }; if (Main.Settings.RoadObjectsToggle && carRoads.Contains(roads[i].RoadType) || vehicleTypes.Contains(roads[i].VehicleType)) { roads[i].XyzCoordinates = roadPointInXyz; RoadObjectRender.Get().RenderObjectsOnRoad(roads[i], middleMapPoint); } UiUtils.SetDefaultCameraPos(middleMapPoint, cameraTransform); } }