private void WorldGenerator(int x_max, int y_max, int z_max) { MatrixWorld = new WorldData(x_max, y_max, z_max); // Заполняем массив простым шумом 0..1 Perlin2D P2D = new Perlin2D(2); // Заполняем данными карту for (int x = 0; x < MatrixWorld.matrix.GetLength(0) - 1; x++) { for (int z = 0; z < MatrixWorld.matrix.GetLength(2) - 1; z++) { // Параметры обтекаемости мира float fx = (float)x / 250 * 5.0f; float fz = (float)z / 250 * 5.0f; // Получаем шум Перлина float fy = P2D.Noise(fx, fz); // , 3, 0.1f, 0.5f); // Вариативность высоты int y = Mathf.RoundToInt(fy * 50) < 0 ? 0 : Mathf.RoundToInt(fy * 50); // Сохраняем данные в карту // 1 значит земля MatrixWorld.matrix[x, y, z] = 1.0f; } } }
public void GenerateNoise(Vector3i offset) { this.offset = offset; int sizeX = map.GetLength(0); int sizeZ = map.GetLength(1); for (int x = 0; x < sizeX; x += step) { for (int z = 0; z < sizeZ; z += step) { Vector3i a = new Vector3i(x, 0, z) + offset; Vector3i b = a + new Vector3i(step, 0, step); float v1 = Perlin2D.Noise(a.x, a.z, scale, persistence, octaves); float v2 = Perlin2D.Noise(b.x, a.z, scale, persistence, octaves); float v3 = Perlin2D.Noise(a.x, b.z, scale, persistence, octaves); float v4 = Perlin2D.Noise(b.x, b.z, scale, persistence, octaves); for (int tx = 0; tx < step && x + tx < sizeX; tx++) { for (int tz = 0; tz < step && z + tz < sizeZ; tz++) { float fx = (float)tx / step; float fy = (float)tz / step; float i1 = Mathf.Lerp(v1, v2, fx); float i2 = Mathf.Lerp(v3, v4, fx); map[x + tx, z + tz] = Mathf.Lerp(i1, i2, fy); } } } } }
public ChunkProvider(uint seed) { Console.Write ("Building Perlin noise maps... "); this._temperature = new Perlin2D (seed); this._humidity = new Perlin2D (seed + 1); this._p3d = new Perlin3D (seed + 2); this._p2d = new Perlin2D (seed + 3); Console.WriteLine ("Done"); }
public static void GenerateAllTerrain() { numCompleted = 0; Perlin2D.Initialize(); Perlin3D.Initialize(); Voronoi.Initialize(); for (int x = 0; x < WidthChunks; x++) { for (int z = 0; z < WidthChunks; z++) { ThreadManager.QueueWork(GenerateTerrainSection, new Vector2i(x, z), false); } } }
/// <summary> /// Старт программы /// </summary> void Start() { // Заполняем массив простым шумом 0..1 Perlin2D P2D = new Perlin2D(2); mapData = new MapData(512, 512, 250); cam.transform.position = new Vector3(mapData.Height.GetLength(0) / 2, 20, mapData.Height.GetLength(1) / 2); // Заполняем данными карту for (int x = 0; x < mapData.Height.GetLength(0) - 1; x++) { for (int z = 0; z < mapData.Height.GetLength(1) - 1; z++) { // Параметры обтекаемости мира float fx = (float)x / 250 * 5.0f; float fz = (float)z / 250 * 5.0f; // Получаем шум Перлина float fy = P2D.Noise(fx, fz); // , 3, 0.1f, 0.5f); // Вариативность высоты int y = Mathf.RoundToInt(fy * 50) < 0 ? 0 : Mathf.RoundToInt(fy * 50); // Сохраняем данные в карту mapData.Height[x, z] = y; // Создаем куб в видимой области CreateNewCubes(x, y, z, ViewDistance); } } // Перемещаем камеру на верхний куб cam.transform.position = new Vector3(cam.transform.position.x, mapData.Height[(int)cam.transform.position.x, (int)cam.transform.position.z] + 5, cam.transform.position.z); // Оптимизация: сохраним первую позицию камеры при отрисовке lastCamPos = Camera.main.transform.position; }