Генерация двухмерного ландшафта с использованием Perlin Noise (На основе плитки)

Я изучал шум перлина для приложения, над которым я работаю, это в основном игра, выглядящая как «двухмерный вид сбоку» (симуляция ). Я не совсем понимаю, как работает перлиновый шум, но общее представление получаю.

Я нашел эту статью с кодом Perlin Noise и решил отдать ее назад, так как в данный момент у меня настроена генерация мира, так что каждый «чанк» имеет тайлы 16x16, и я только что заявил, что если Y >= HEIGHT / 2, сделайте все плитки «твердыми», иначе «воздухом», чтобы это работало... но земля очень плоская, как вы можете себе представить. Вот где я думал, что появится шум перлина, поэтому я использовал код, найденный на указанном выше веб-сайте, но я не уверен, как преобразовать шум в твердые/воздушные плитки.

Как видите, не очень реалистичный рельеф.enter image description here

Я больше хочу, чтобы местность была такой, как внизу. должно выглядеть как горы и холмы)Меня не беспокоят острые края (квадрат) enter image description here

Я не знаю, как перебрать массив тайлов, чтобы превратить шум в выше

В данный момент я перебираю через массив тайлов (2d)вроде так, но, как вы можете видеть на первом рисунке, он просто рандомизирует, является ли тайл сплошным или нет, он не создает никаких холмов или гор.

for(int Y = 0;Y < HEIGHT;++Y) {
    for(int X = 0;X < WIDTH;++X) {
        Tile Tile;
        if(noise(X,Y) < 0) {
            Tile.Type = BLOCK;
        } else {
            Tile.Type = Air;
        }

        // Then I push the Tile on to a vector

Я также должен упомянуть, что справа от этого «фрагмента» 16x16 есть еще один фрагмент, который необходимо сопоставить с этим, и то же самое происходит со следующим фрагментом после него. Чанки не должны быть такими же, как предыдущие, просто сделайте так, чтобы они выглядели так, как будто они не являются отдельными фрагментами, если это имеет смысл.

Будем признательны за любую помощь!Спасибо

ОБНОВЛЕНИЕ

Я изменил свои функции perlin на функции этого и реализовал то, что предложил phresnel:

    PerlinNoise *test=new PerlinNoise(0.25, 6);    //0.25 is Persistance 6 is Octaves

        float f,h;
        float seed = 804.343;

        for (int X=0; X!=MAP_WIDTH; ++X) {

            f = test->GetNoise((X * ChunkX) * seed);

            h = f * MAP_HEIGHT + (MAP_HEIGHT / 2);

            for (int y=0; y

После этого все выглядит намного лучше, я X * ChunkXдля каждого шум как если бы я не делал все фрагменты одинаковыми, так что теперь это выглядит следующим образомenter image description here

Как вы можете видеть, местность больше соответствует тому, что я хочу, чем раньше, но все еще не очень похожа на реальную местность, так как она не очень гладкая, могу ли я что-нибудь сделать, чтобы сгладить общий вид для создания Rolling hills и равнины

Я удалил создание плиток под этими значениями шума, чтобы было легче увидеть диапазон enter image description here

Как вы видите выглядит нормально, просто значения нужно "сгладить", чтобы они не выглядели как псевдо-случайные значения. Мне также интересно, почему первый фрагмент, показанный слева, имеет одинаковые значения на всем протяжении.

Спасибо.

6
задан Elgoog 20 April 2012 в 04:09
поделиться