Друг только что связал меня с этим вопросом, и я подумал, что попытаюсь прояснить пару вещей, которые не рассматриваются в принятом ответе.
В интересной и полезной статье Элиаса используется «шум значений», а не «шум Перлина». Ценностный шум включает подгонку кривой рандомизированных точек. Градиентный шум (основным примером которого является шум Перлина) создает решетку из точек с нулевым значением и дает каждой из них случайный градиент. Их часто путают друг с другом!
http://en.wikipedia.org/wiki/Gradient_noise
Во-вторых, использование третьего значения в качестве начального числа дорого. Если вам нужна случайная местность, подумайте о переводе вашего происхождения в случайную величину. Звонки в формате 3D будут дороже, чем звонки в формате 2D. И все, что вы делаете, это используете значение z для выбора определенного фрагмента 2D-шума.
В-третьих, прямой вызов функции будет возвращать значения, которые в целом довольно плавные и скользящие, а не такие скалистые, как реальный ландшафт, поскольку случайность ограничена одной частотой. Чтобы получить более сложную местность, хорошей техникой является суммирование нескольких вызовов, которые проходят через шумовое пространство с разными частотами, обычно устанавливая «фрактальные» значения.
Таким образом, например, сложите вместе _1 _...
Результирующая сумма, вероятно, будет часто выходить за пределы диапазона от -1 до 1, поэтому вам придется нормализовать результат, прежде чем значения станут полезными. Я хотел бы предложить настроить ряд факторов (1, 1/2, 1/4 и т. Д.), Чтобы вы гарантированно оставались в пределах [-1, 1], что можно сделать путем прогрессивного взвешивания в зависимости от того, сколько "октавы", которые вы используете. (Но я не знаю, действительно ли это самый эффективный способ сделать это.)
Пример с четырьмя октавами: (1/15)(noise(x, y) + (2/15)(noise(2x, 2y) + (4/15)(noise(4x, 4y) + (8/15)(noise(8x, 8y)
Затем используйте нормализацию "турбулентного шума", взяв сумму и сделав ее = |sum|
(то есть, используя функцию abs). Это придаст местности четко выраженные угловатые гребни долины, а не плавно перекатывается.
Я работаю над визуализатором SimplexNoise, надеюсь, в конечном итоге открою его исходный код на GitHub как проект Java. Первый черновик визуализатора можно найти и запустить в этом сообщении на java-gaming.org: http://www.java-gaming.org/topics/simplex-noise-experiments-towards-procedural-generation/27163/view.html Основное внимание в первом черновике уделяется руководству с примерами сгенерированного кода (но они написаны на Java).
Отличная статья о том, как работает SimplexNoise (и Perlin vs Gradient background): http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf
Стефан Густавсон отлично с этим справился!
person
Phil Freihofner
schedule
27.09.2012