Реалистичная 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. Это генератор ландшафта, который может делать именно то, что вы просите, и многое другое. Он был использован профессионалами для создания изображений, трехмерного земного ландшафта и даже для таких карт, как то, что вы предлагаете. Обратите внимание, что бесплатная версия предназначена только для некоммерческих целей.