Node CreateTile(int index) { var cache = Application.ResourceCache; Node tile = Node.CreateChild(); var planeNode = tile.CreateChild(); planeNode.Scale = new Vector3(BackgroundScale, 0.0001f, BackgroundScale); var planeObject = planeNode.CreateComponent <StaticModel>(); planeObject.Model = cache.GetModel(Assets.Models.Plane); planeObject.SetMaterial(cache.GetMaterial(Assets.Materials.Grass)); // area for trees: var sizeZ = BackgroundScale / 2.1f; var sizeX = BackgroundScale / 3.8f; Node treeNode = tile.CreateChild(); treeNode.Rotate(new Quaternion(0, RandomHelper.NextRandom(0, 5) * 90, 0), TransformSpace.Local); treeNode.Scale = new Vector3(0.3f, 0.4f, 0.3f); var treeGroup = treeNode.CreateComponent <StaticModel>(); treeGroup.Model = cache.GetModel(Assets.Models.Tree); treeGroup.SetMaterial(cache.GetMaterial(Assets.Materials.Pyramid)); for (float i = -sizeX; i < sizeX; i += 3.2f) { for (float j = -sizeZ; j < sizeZ; j += 3.2f) { var clonedTreeNode = treeNode.Clone(CreateMode.Local); clonedTreeNode.Position = new Vector3(i + RandomHelper.NextRandom(-0.3f, 0.3f), 0, j); } } treeNode.Remove(); tile.Rotate(new Quaternion(270 + BackgroundRotationX, 0, 0), TransformSpace.Local); tile.RotateAround(new Vector3(0, 0, 0), new Quaternion(0, BackgroundRotationY, 0), TransformSpace.Local); var tilePosX = BackgroundScale * (float)Math.Sin(MathHelper.DegreesToRadians(90 - BackgroundRotationX)); var tilePosY = BackgroundScale * (float)Math.Sin(MathHelper.DegreesToRadians(BackgroundRotationX)); tile.Position = new Vector3(0, (tilePosX + 0.01f) * index, tilePosY * index + FlightHeight); return(tile); }