О чем этот пример

Визуализация процедурного шума — мощный инструмент для генерации текстур, ландшафтов и атмосферных эффектов в играх. Phaser 3 предоставляет встроенный Game Object `noisesimplex3d` для этой задачи. В этой статье мы разберем, как параметр `noiseIterations` влияет на детализацию и сложность получаемой текстуры, что позволит вам создавать более разнообразный и интересный визуальный контент для ваших проектов.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    create()
    {
        const { width, height } = this.scale;

        this.add.noisesimplex3d({
            noiseCells: [ 4, 9, 4 ]
        }, width * 1 / 8, height / 2, width / 4, height);
        this.add.noisesimplex3d({
            noiseCells: [ 4, 9, 4 ],
            noiseIterations: 2
        }, width * 3 / 8, height / 2, width / 4, height);
        this.add.noisesimplex3d({
            noiseCells: [ 4, 9, 4 ],
            noiseIterations: 3
        }, width * 5 / 8, height / 2, width / 4, height);
        this.add.noisesimplex3d({
            noiseCells: [ 4, 9, 4 ],
            noiseIterations: 4
        }, width * 7 / 8, height / 2, width / 4, height);

        this.add.text(10, 10, '1 iteration', { fontSize: 24 }).setStroke('#ff8844', 2).setShadow(2, 2, '#333333', 2, true, false);
        this.add.text(width / 4 + 10, 10, '2 iterations', { fontSize: 24 }).setStroke('#ff8844', 2).setShadow(2, 2, '#333333', 2, true, false);
        this.add.text(width / 2 + 10, 10, '3 iterations', { fontSize: 24 }).setStroke('#ff8844', 2).setShadow(2, 2, '#333333', 2, true, false);
        this.add.text(width * 3 / 4 + 10, 10, '4 iterations', { fontSize: 24 }).setStroke('#ff8844', 2).setShadow(2, 2, '#333333', 2, true, false);
    }
}

const config = {
    type: Phaser.WEBGL,
    parent: 'phaser-example',
    width: 1280,
    height: 720,
    scene: Example
};

const game = new Phaser.Game(config);

Создание объекта шума

Основной объект для работы — this.add.noisesimplex3d. Он создаёт и отображает текстуру, сгенерированную на основе 3D-симплекс-шума.

Конструктор принимает объект с настройками и параметры позиционирования:

this.add.noisesimplex3d(config, x, y, width, height);

В нашем примере все объекты имеют одинаковый базовый конфиг { noiseCells: [ 4, 9, 4 ] } и расположены друг за другом по горизонтали. Параметр noiseCells задает «зернистость» шума по осям X, Y, Z.

Магия параметра noiseIterations

Ключевой параметр, который мы исследуем, — noiseIterations. По умолчанию он равен 1.

// Шум с одной итерацией (значение по умолчанию)
{ noiseCells: [ 4, 9, 4 ] }

// Шум с двумя итерациями
{ noiseCells: [ 4, 9, 4 ], noiseIterations: 2 }

Каждая последующая итерация добавляет новый слой шума с удвоенной частотой и уменьшенной амплитудой, накладываясь на предыдущий результат. Этот принцип известен как «фрактальный шум» или «octaves» в других библиотеках. Он позволяет создавать более детализированные и натуралистичные паттерны.

Визуальный результат итераций

В примере создаются четыре текстуры с разным количеством итераций (от 1 до 4).

this.add.noisesimplex3d({
    noiseCells: [ 4, 9, 4 ],
    noiseIterations: 4
}, width * 7 / 8, height / 2, width / 4, height);

Наглядно видно, как с ростом noiseIterations простая крупнозернистая структура (1 итерация) превращается в сложную, многослойную текстуру с обилием мелких деталей (4 итерации). Это прямое следствие наложения высокочастотных слоев шума.

Практическое применение в играх

Управляя noiseIterations, вы можете генерировать текстуры для разных целей: * **noiseIterations: 1-2:** Крупные, плавные паттерны для фоновых текстур, облаков, базовой высоты ландшафта. * **noiseIterations: 3-4:** Детализированные текстуры для камня, дерева, травы или для добавления мелких неровностей на карту высот.

Объект noisesimplex3d можно использовать не только для статичных текстур, но и для анимации, меняя параметры или смещая Z-координату шума в кадре.

Что попробовать дальше

Параметр noiseIterations в noisesimplex3d — это простой и эффективный способ контролировать уровень детализации процедурного шума. Начните экспериментировать: попробуйте анимировать значение noiseIterations для плавного «проявления» деталей, комбинируйте текстуры с разными настройками в одном кадре или используйте результат как маску для других графических элементов.