Как эффективно распределить объекты на 2D-поверхности «естественным» способом? - PullRequest
1 голос
/ 29 июня 2010

Я хотел бы эффективно создавать позиции для объектов на данной поверхности.Как вы, наверное, догадались, это для игры.Поверхность на самом деле является трехмерной местностью, но третье измерение не имеет значения, так как оно определяется высотой местности.

Проблема в том, что я хотел бы сделать это наиболее эффективным и простым способом, но все же получить хорошееРезультаты.То, что я подразумеваю под «естественным», является чем-то вроде mentoined в этой статье о шуме Перлина .(деревья, образующие леса, от больших до небольших групп на земле) Подход хороший, но слишком сложный.Мне нужно делать это довольно часто и желательно, без каких-либо дополнительных текстур, даже за счет снижения производительности (поэтому результаты не будут такими же хорошими, но все же достаточно хорошими, чтобы дать хороший естественный ландшафт с растительностью).

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

Ответы [ 3 ]

4 голосов
/ 29 июня 2010

Возможно, это не тот ответ, который вы ищете, но я считаю, что Perlin Noise - это решение вашей проблемы.

Сам Perlin Noise не содержит текстур; Я действительно считаю, что у вас есть неправильное понимание того, что это такое. В основном, для ваших целей, это двумерный индекс, для каждой точки значение между 0 и 1. Вам не нужно создавать никаких текстур. См. это описание этого для получения дополнительной информации и элегантного объяснения. Основы Perlin Noise включают создание нескольких карт случайных шумов, начиная с одной с очень небольшим количеством точек, и с каждой новой, имеющей в два раза больше точек случайности (и меньшей амплитуды), и складывая их вместе.

Особенно, если ваша карта дискретно выложена плиткой, вам даже не нужно создавать шум с высоким разрешением:)

Как часто вы планируете это делать? Если вы собираетесь делать это 10 + раз за каждый кадр , тогда Perlin Noise может не быть вашим ответом. Однако, если вы делаете это один раз каждые несколько секунд (или меньше) , то я не думаю, что у вас должны быть какие-либо заботы о влиянии скорости - по крайней мере, для 2D Perlin Noise.

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

  1. Генерировать перлин-шум; более высокая турбулентность = меньше комкования и больше изолированных элементов.

  2. Установить «порог» (т. Е. 0,5) - все, что выше этого порога, считается «включенным», а все, что выше него, считается «выключенным». Более высокий порог = более частый, более низкий порог = менее частый.

  3. Заполните "на" плитки тем, что вы делаете.

Вот несколько примеров Perlin Noise для создания карты размером 50x50. Обратите внимание, что единственной разницей между природой является «порог». Большие комки означают более низкий порог, меньшие комки означают более высокий.

Лес с голубыми деревьями и коричневым подлеском Редкий лес http://img688.imageshack.us/img688/7005/forestmap.png

Болото с глубокими участками, окруженными более мелкими участками Болота http://img202.imageshack.us/img202/5092/marshdemo.png

0 голосов
/ 29 июня 2010

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

0 голосов
/ 29 июня 2010

Обратите внимание, что вам придется немного подправить константы, но вы можете сделать что-то вроде этого

Сначала выберите случайную точку. (скажем, 24,50). Затем определите точки интереса для этого объекта. Если это скала, ваши очки могут быть две горы на 15,13 или 50,42. Если бы это был лес, он мог бы использовать некоторые показатели, чтобы найти «центр» пары местных лесов. Затем рассчитайте векторы расстояния между точкой и интересующими точками и масштабируйте их до некоторой постоянной величины. Теперь добавьте все эти векторы к точке. Затем определите, находится ли объект в законном положении. Если это так, перейдите к следующему объекту. Если это не так, повторите процесс.

Адаптируйте при необходимости. : -)

...