Процедурная генерация областей с явно более высокими отметками с помощью Perlin Noise

Я пытаюсь узнать о Perlin Noise и процедурной генерации. Я читаю онлайн-руководство по созданию ландшафтов с шумом, но я не понимаю часть объяснения автора о создании областей с большей высотой.

На этой веб-страницы в разделе "острова" есть текст

Создайте форму, которая соответствует тому, что вы хотите от островов. Используйте нижнюю фигуру, чтобы подтолкнуть карту вверх, и верхнюю фигуру, чтобы подтолкнуть карту вниз. Эти формы являются функциями от расстояния d до высоты 0-1. Установите e = нижний (d) + e * (верхний (d) - нижний (d)).

Я хочу сделать это, но я не уверен, что автор имеет в виду, когда говорит о верхних и нижних формах.

Что мог иметь в виду автор, говоря: «Используйте нижнюю форму, чтобы подтолкнуть карту вверх, и верхнюю форму, чтобы подтолкнуть карту вниз»?

Пример кода:

from __future__ import division
import numpy as np
import math
import noise


def __noise(noise_x, noise_y, octaves=1, persistence=0.5, lacunarity=2):
    """
    Generates and returns a noise value.

    :param noise_x: The noise value of x
    :param noise_y: The noise value of y
    :return: numpy.float32
    """

    value = noise.pnoise2(noise_x, noise_y,
                          octaves, persistence, lacunarity)

    return np.float32(value)


def __elevation_map():
    elevation_map = np.zeros([900, 1600], np.float32)

    for y in range(900):

        for x in range(1600):

            noise_x = x / 1600 - 0.5
            noise_y = y / 900 - 0.5

            # find distance from center of map
            distance = math.sqrt((x - 800)**2 + (y - 450)**2)
            distance = distance / 450

            value = __noise(noise_x, noise_y,  8, 0.9, 2)
            value = (1 + value - distance) / 2

            elevation_map[y][x] = value

    return elevation_map

person LuminousNutria    schedule 22.03.2019    source источник


Ответы (1)


Автор имеет в виду, что вы должны описать конечную высоту fe точки с точки зрения ее расстояния от центра d, а также начальную высоту e, которая предположительно была создана шумом.

Так, например, если вы хотите, чтобы ваша карта выглядела как чаша, но сохраняла шумовые характеристики вашего изначально сгенерированного ландшафта, вы могли бы использовать следующие функции:

def lower(d):
    # the lower elevation is 0 no matter how near you are to the centre
    return 0

def upper(d):
    # the upper elevation varies quadratically with distance from the centre
    return d ** 2

def modify(d, initial_e):
    return lower(d) + initial_e * (upper(d) - lower(d))

Обратите особое внимание на абзац, начинающийся словами «Как это работает?», который я нашел весьма показательным.

person gmds    schedule 23.03.2019
comment
Я только что понял, что мы должны сделать 0 + initial_e * (distance ** 2) - 0? Зачем вообще возиться с нулями? - person LuminousNutria; 30.03.2019
comment
@LuminousNutria Это конкретный случай lower и upper. Вы можете легко использовать другие функции; например, min(d, -10). - person gmds; 30.03.2019