Процедурно генерирующие области с заметно более высокими возвышениями с шумом Perlin - PullRequest
1 голос
/ 23 марта 2019

Я пытаюсь узнать о 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

1 Ответ

3 голосов
/ 23 марта 2019

Автор означает, что вы должны описать окончательную высоту 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))

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

...