Привет, ребята, я пытаюсь выяснить, как генерировать мозаичные фракталы в коде (для игровых карт, но это не имеет значения ) Я пытался изменить плагин Solid Noise, поставляемый с GIMP (с моим крайне ограниченным пониманием того, как код работает) но я не могу заставить мой работать правильно.
Мой модифицированный код до сих пор (Java)
Модуль чистого шума GIMP, на котором я основываю свой код (C)
Вот то, что я пытаюсь достичь, но это то, что я получаю
Так что, если кто-нибудь увидит, что я сделал неправильно, или у меня есть предложение, как мне поступить иначе, я был бы очень признателен. Заранее спасибо. И если я спрашиваю путь много или если просто огромный провал в жизни, я прошу прощения.
java
procedural-generation
maps
Ник Бадал
источник
источник
Ответы:
Я не точно следую вашему коду, но здесь приведено упрощенное описание алгоритма, который примерно достигнет эффекта (на основе изображения, которое вы разместили).
Следующее объяснение не является супероптимизированной версией, но концептуально понятно (я надеюсь). После того, как вы запустили его, вы можете оптимизировать его (на самом деле довольно радикально).
Сложным шагом является этап выборки и интерполяции. Предположим, что мы находимся в слое, пропускающем выборку каждого m-го пикселя. Вот основная идея для m> 1 (если m равно 1, мы используем изображение как есть):
Несколько советов:
источник
Кажется, что мой оригинальный pastebin истек как-то, поэтому у меня нет возможности сравнить мой нерабочий код, но в моей текущей игре я прошел и перевел GIMP-код в java снова, и теперь он, кажется, работает нормально.
Если кто-то планирует использовать этот код, я бы порекомендовал изменить конструктор, чтобы изменить параметры настройки (детали и размер), чтобы вы могли заставить его работать так, как вам хочется. РЕДАКТИРОВАТЬ: я понял, что мой первоначальный вопрос был о том, чтобы сделать его мозаичным, так что не забудьте установить tilable в true!
Код: http://pastebin.com/KsfZ99Xa
Пример:
источник
Просто пролистал версии Java и C и заметил небольшую разницу в том, как вы используете функцию шума. Вот твой:
Код C:
Почему вы решили не вычитать смещение? (col - xoffset) и (row - yoffset)
Просто интересуюсь. У меня нет времени, чтобы сделать полный анализ кода.
Надеюсь это поможет.
источник
Я не знаю, может ли это помочь, но следующий трюк помог мне:
http://www.gamedev.net/blog/33/entry-2138456-seamless-noise/
Этот сотрудник использует функцию шума 4d и просто предоставляет значения xy двух окружностей в качестве значений xyzw для шума 4d. Результат зацикливается идеально.
Вот идея (упрощенная) для картинки 1000 * 1000:
источник
Я рекомендую вам использовать алгоритм алмазного квадрата , также известный как фрактал плазмы или случайный фрактал смещения средней точки. Используя этот алгоритм, очень легко ограничить ребра одинаковыми значениями. Когда вы генерируете значение для ребра, скопируйте его в соответствующее ребро на другой стороне. Это дает идеально мозаичную карту.
источник
Там есть отличная статья о генерации шума здесь . Это не шум Перлина, как утверждает статья (на самом деле это розовый шум), но все же невероятно полезно понять, как генерируются шумовые изображения.
Итак, чтобы на самом деле ответить на ваш вопрос: чтобы создать мозаичное изображение шума, вам просто нужно сохранять «мозаичность» на протяжении всего поколения. То есть, когда шум сглаживается, вы сглаживаете его, как если бы он повторялся бесконечно во всех направлениях - плиточный.
источник
На скриншоте я предполагаю, что генерируются только «большие» слои, поэтому шум кажется слишком регулярным и не хватает деталей.
Это может звучать глупо, но вы пытались увеличить переменную «detail» (строка 16)? В вашем коде он равен 1, что означает, что алгоритм будет генерировать только два слоя детализации перед остановкой. Попробуйте увеличить его примерно до 8.
источник
Вы также должны взглянуть на Simplex Noise , разработанный Кеном Перлином для исправления некоторых недостатков шума Перлина.
Я работал над реализацией Simplex Noise для игры на C ++. Он поддерживает многооктавный шум 1D / 2D / 3D / 4D. Прямо сейчас единственная встроенная текстура - мрамор, но вы можете легко добавить больше:
(Http://code.google.com/p/battlestar-tux/source/browse/trunk/src/lib/procedural/)
источник