Реалистичная 2D-карта местности

Я ищу некоторые алгоритмы, которые позволяют мне создать реалистичную карту 2D-ландшафта. По реалистичным я имею в виду, что человек будет рассматривать такую ​​карту как "нормальную" карту местности, не созданную искусственно. Я не хочу создавать фотореалистичную карту. Просто что-то похожее на карты, которые можно увидеть в географическом атласе.

До сих пор я использую perlin noise для карты высоты, а затем добавляю озера, реки, горы, болота и так далее. Вы можете посмотреть, как это выглядит на рисунке ниже:

Карта местности http://www.freeimagehosting.net/uploads/1f1e9372bf.png

Я не доволен этим. Это нереально, но я не могу понять что-то лучше. Время не является вопросом, поэтому алгоритмы могут быть тяжелыми вычислительными.

Спасибо за ваше время.

После редактирования:

Я думаю, что нашел одну статью, которая может быть полезна: http://portal.acm.org/citation.cfm?id=1255047.1255077

Однако он не может быть получен бесплатно, поэтому я все еще ищу ответы или идеи.

Ответы

Ответ 1

Я играл с генерацией местности раньше. Предполагая, что цель - растровое изображение, я нашел способ сделать такие вещи, как реки, и в целом сделать это лучше: Эрозия.

Как только у вас есть ландшафт, созданный другими способами, он немного размывается: вам нужен мир, выраженный в виде высоты пикселей. Возьмите пятно на карте и переместите одну единицу высоты до самого низкого соседа. Переместите курсор к этому соседу и повторите, пока он не сдвинется. Повторите для других пикселей.

Чтобы река подсчитала количество раз, когда вы проходите через место, перемещающее биты вниз. Пятна, которые поражают больше всего, - это реки.

Followup: я не искажал каждый пиксель так, как просто большое количество случайных пикселей, пока он не выветрился. Причина их фактического размывания заключается в том, что это переносит биты и заполняет отверстия. Без этого не может быть рек, так как там будут мертвые, которые задерживают поток - проточные пиксели заполняют любые небольшие отверстия и делают рабочие водные пути.

Извините, я не могу дать никаких образцов, это было много лет назад, и, хотя старый код, вероятно, где-то рядом, я не знаю, где искать.

Ответ 2

Ландшафт создается множеством разных причин во многих разных временных масштабах. Чтобы действительно создать реалистичный ландшафт, вам придется имитировать их.

В "короткий" термин гидросфера определяет большинство характеристик. Вероятно, вы можете начать с местности воксела/частицы/высоты/сетки, содержащей основные функции (горные хребты и т.д.), И рассматривать ее как неизменную, а затем обрабатывать ее с помощью множества симуляций воды. Вам нужно будет вычислить, где будут реки и озера, как они разрушают базовый ландшафт и где они образуют месторождения. Если бы мне пришлось это кодировать, я бы, вероятно, начал с 3D-мир вокселей.

Это была бы гигантская задача, и я уверен, что есть много трюков, доступных для генерации определенных типов ландшафта, которые занимают миллисекунды вместо минут. Какую местность вы хотите создать? Горный? Низменность? Промышленно? Лес? Десерт? Архипелаг?

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

Ответ 3

Мой метод в Terra3D должен был генерировать случайные значения высоты, а затем сделать 3 сглаживающих прохода с небольшой перестановкой, записанной в алгоритм. Перестройка приводит к тому, что рельеф под линией воды немного сдвигается вниз, и все выше линии воды немного сдвигается. Эффект, хотя и много холмов и небольших озер. И это может быть не то, что вы ищете точно.

Тем не менее, я не уверен, что директор позади моего метода не может быть использован, чтобы получить то, что вы хотите. Вам просто нужно написать еще несколько условий в алгоритм изменения/сглаживания. Например, уменьшение количества сглаживания на местности на более высоких высотах создаст более скалистый горный вид. И затем, написав более сложный сглаживающий (или гауссовский) алгоритм, который простирается дальше для более низких возвышений, может объединить эти озера вместе с естественными реками.

Здесь код генерации местности в Terra3D в случае, если вам интересно:

  // GENERATE TERRAIN
  for (i = 0; i < MAX; i++)
  {     
    for (i2 = 0; i2 < MAX; i2++)
    {
        if (i<10 || i2<10 || i>MAX-10 || i2>MAX-10)
        field[i][i2].y=0;
      else
        field[i][i2].y=(GLfloat(rand()%151)-75)/50+(field[i-1][i2-1].y+field[i-1][i2].y+field[i-1][i2+1].y+field[i-1][i2-2].y+field[i-1][i2+2].y)/5.05;
    }
  }

  // SMOOTH/RESHAPE TERRAIN
  for (int cnt = 0; cnt < 3; cnt++)
  {  
    for (int t = 1; t < MAX-1; t++)
    {
      for (int t2 = 1; t2 < MAX-1; t2++)
      {
        field[t][t2].y = (field[t+1][t2].y+field[t][t2-1].y+field[t-1][t2].y+field[t][t2+1].y)/4;

        if (cnt == 0)
        {
          if (field[t][t2].y < -1 && field[t][t2].y > -1-.5) field[t][t2].y -= .45, field[t][t2].y *= 2;
          else if (field[t][t2].y > -1 && field[t][t2].y < -1+.5) field[t][t2].y += .5, field[t][t2].y /= 5;
        } 
      }
    }
  }

Это неряшливый код, который я написал около 10 лет назад. Terra3D был долгим процессом обучения экспериментов и возиться в темноте, чтобы создать тип эффектов, которые я искал. Но, возможно, это поможет.

Ответ 4

Я знаю, что это действительно старый вопрос, но я отвечаю за это для будущих людей, которые ищут хороший генератор местности, как и я. Используйте бесплатную версию World Machine 2. Это генератор ландшафта, который может делать именно то, что вы просите, и многое другое. Он был использован профессионалами для создания изображений, трехмерного земного ландшафта и даже для таких карт, как то, что вы предлагаете. Обратите внимание, что бесплатная версия предназначена только для некоммерческих целей.