Поколение ландшафта на лету на основе существующего ландшафта

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

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

Главная карта

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

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

https://stackru.com/images/3a92e2405dd52750e642190a174be120c54908ec.png

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

https://stackru.com/images/3147a59a47f96f829be4dd69a15ce610c5fb4bb9.png

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

https://stackru.com/images/1d7ae59241225605144de683bef17aec285a655f.png

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

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

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

1 ответ

Решение

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

Другие вопросы по тегам