Поколение ландшафта на лету на основе существующего ландшафта - PullRequest
8 голосов
/ 11 июня 2011

Этот вопрос очень похож на поставленный здесь .

Моя проблема в том, что у меня есть карта, примерно такая:

Main Map

Эта карта сделана с использованием 2D-шума Перлина, а затем проходит через созданную карту высот, назначая типы и цветовые значения каждому элементу в ландшафте на основе высоты или наклона соответствующего элемента, поэтому довольно стандартно. Массив карты является двухмерным и имеет точные размеры экрана (пиксель на пиксель), поэтому при разрешении 1200 на 800 генерация занимает около 2 секунд на моей установке.

Теперь увеличиваем выделенный прямоугольник:

http://i.stack.imgur.com/hrZnM.png

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

http://i.stack.imgur.com/bbLia.png

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

http://i.stack.imgur.com/6shKz.png

Так что для того, чтобы это работало должным образом, вам нужно было бы сделать чрезмерное количество, я полагаю, слово будет интерполяцией, чтобы создать плавный переход, когда игрок перемещает около 40 пространств сетки в местном мире, необходимых для достичь следующей плитки в мире. Это кажется сложным и очень не элегантным.

Второй подход состоит в том, чтобы разбить сетку исходной карты на более мелкие биты, возможно, разделив каждый квадрат на 4? Я не реализовал это, и я не уверен, каким образом я мог бы увеличить детализацию, но я думаю, что это, вероятно, окажется лучшим решением.

Есть идеи, как я могу подойти к этому? Имейте в виду, что это должно быть локально и на лету. Я хочу любой ценой избежать увеличения разрешения карты.

1 Ответ

9 голосов
/ 11 июня 2011

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

...