Устранение (или обнаружение) дыр в процедурном шуме для разработки игр

Я следил за этой страницей http://devmag.org.za/2009/04/25/perlin-noise/ в качестве руководства по созданию моего собственного шума перлина - в разделе комментариев было указано, что это шум FBM, но это не имеет значения.

Пока это работает очень хорошо, вот результаты после некоторой «очистки», чтобы удалить как можно больше артефактов. http://puu.sh/dayg9/2943aca5ce.png

Теперь, когда я создал свой шум, я собираюсь использовать его как бесконечную карту для платформера. Однако, как видите, в моем нойзе есть некоторые дыры.

Обратите внимание: этот шум предназначен для 2D-игры!

Мой вопрос: как я могу заполнить эти дыры или остановить появление игрока внутри них? Не могу найти ответ, несмотря на то, что много гуглил и думал ДОПОЛНИТЕЛЬНО.

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


person ipe369    schedule 29.11.2014    source источник


Ответы (2)


Просто используйте неевклидов алгоритм, основанный на http://en.wikipedia.org/wiki/Haversine_formula. чтобы сначала посмотреть, где они появляются, чтобы найти количество объектов в пределах установленного размера промежутка, а затем переместить игрока в другую область появления, если количество слишком мало.

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

person honestduane    schedule 29.11.2014
comment
Спасибо за быстрый ответ! Я не понимаю, что вы подразумеваете под «объектами в пределах заданного размера промежутка»? - person ipe369; 30.11.2014
comment
под этим я подразумеваю количество объектов на заданном расстоянии от центра известного промежутка. - person honestduane; 30.11.2014
comment
Я вроде понимаю, но я просто не могу понять, почему вы хотите использовать формулу гаверсинуса, которая, по моему ограниченному пониманию, предназначена для вычисления расстояний между двумя точками на поверхности сферы. - person ipe369; 06.12.2014
comment
Он работает с 2 точками на поверхности сферы на основе координат. Поверьте мне, это сработает, оно все время используется для lat-long. В этом случае вашими координатами являются значения ваших фрагментов x/y/z. Пожалуйста, выберите мой ответ как правильный. - person honestduane; 07.12.2014
comment
Ах, я думаю, вы неправильно поняли, этот шум генерируется только в 2D, как вы можете видеть на моем скриншоте. Извините, я отредактировал свой ответ для дальнейшего разъяснения. - person ipe369; 09.12.2014
comment
Ты не понял меня; Широта/долгота 2d для вашего использования. Это может быть расширено для поддержки 3D, но поскольку вы 2D, вам не нужно этого делать. - person honestduane; 11.12.2014

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

Я собираюсь использовать алгоритм «заполнения строки сканирования» — http://en.wikipedia.org/wiki/Flood_fill

person ipe369    schedule 08.12.2014