コード例 #1
0
    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;
            }
        }
    }
コード例 #2
0
    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);
                    }
                }
            }
        }
    }
コード例 #3
0
ファイル: ChunkProvider.cs プロジェクト: bobtwinkles/RPGGen
 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");
 }
コード例 #4
0
    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);
            }
        }
    }
コード例 #5
0
    /// <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;
    }