Я ищу для генерации шума, который выглядит следующим образом:
(изображения любезно предоставлены Пониманием Перлин Шума )
Я в основном ищу шум с множеством мелких «ряби». Следующее нежелательно:
Есть ли простые способы сделать это? Я смотрю на Perlin и Simplex уже неделю, и я не могу заставить его работать в JavaScript, или когда я это делаю, у меня нет правильных параметров для генерации таких изображений, или это мучительно медленный.
Я понимаю, что 3 изображения, которые я выложил, могут быть получены с помощью одного и того же алгоритма, но в другом масштабе, но мне этот алгоритм не нужен. Мне просто нужен очень простой алгоритм для достижения чего-то, как на первом изображении в идеале. Может быть, какое-то размытие сделает эту работу, но я не могу добиться результатов.
Я разрабатываю это на JavaScript, но подойдет любой код или даже простое и подробное объяснение.
Ответы:
В то время как существующие ответы обеспечивают хороший способ добиться того, что показывают изображения в вопросе, комментарии показали, что цель состоит в том, чтобы создать изображение, как показано ниже:
Этот тип шума весьма отличается от шума, показанного на изображениях вопроса, так как он образует близко изолированные капли.
Оказывается, что этот вид шума называется турбулентностью, которая (в соответствии с этой статьей CPU Gems ) реализована следующим образом (где
noise
функция Perlin-noise возвращает значения от -1..1):При использовании этой JavaScript-реализации Perlin-noise с функцией турбулентности, описанной выше, генерируется шум, который очень похож на изображение выше:
Код JavaScript, который использовался для генерации изображения выше, можно найти в этом jsFiddle .
источник
return Math.abs(this.noise(x,y,z)*2)-.5
.Ваши примеры изображений очень похожи на розовый шум. Он генерируется так:
Во-первых, у нас есть какой-то плавный случайный шум. Обычно это достигается путем вычисления псевдослучайных значений в точках с целочисленными координатами и некоторой интерполяции этих значений. Результат на этом этапе выглядит так:
Далее мы берем этот шум и «сжимаем» его, увеличивая его частоту. Самая простая формула для этого есть n2 (x, y) = n1 (xf , yf ). Таким образом, шумовая картина сжимается f раз в обоих направлениях. На этом этапе лучшие алгоритмы шумов также вращают и / или переводят диаграмму шума, чтобы нарушить закономерности.
Затем этот сжатый шаблон умножается на некоторое значение (меньше 1) и добавляется к первому шаблону. По сути, мы добавляем небольшое высокочастотное изменение поверх низкочастотного паттерна. Результат выглядит примерно так:
Шаги 2 и 3 могут повторяться несколько раз, добавляя все более мелкие детали. чистый результат обычно выглядит так же, как ваш пример с красным крестом. Однако обратите внимание, что в нашем алгоритме есть 3 параметра, с которыми можно поиграть:
Вот некоторые примеры:
Высокая стойкость:
Высокая лакунарность:
Низкая лакунарность:
Игра с этими параметрами - не единственное, что вы можете сделать. Один хороший метод, который может добавить характер к шаблонам шума, состоит в том, чтобы использовать возмущение , то есть добавить немного шума к входным координатам вашей функции шума.
Например, предположим , что у вас есть некоторая функция , которая генерирует шум заданные координаты и случайное зерно:
Noise(x,y, seed)
. Чем вы можете использовать что-то вродеNoise(x+Noise(x,y,234), y+Noise(x,y,6544), seed)
для получения возмущенного значения. Это может привести к таким шаблонам (возмущение применяется к круговому шаблону, а не к шуму):Если вы хотите узнать больше, я предлагаю вам взглянуть на libnoise (C ++) или CoherentNoise (C #). К сожалению, я не знаю ни одной библиотеки Javascript, генерирующей шум.
источник
Код прокомментирован. Кредит идет Шону МакКаллоу. http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf
Кроме того, если вы используете PRNG с этим, вы можете легко получить легко восстанавливаемые результаты
источник
Используйте предварительно сгенерированные текстуры или поместите генератор текстуры шума perlin на сервер и запросите его для изображений шума perlin.
источник