Функция падения для гор - PullRequest
0 голосов
/ 03 мая 2018

Я пишу похожую на минкрафт игру с воксельным ландшафтом.

Для гор я указываю местоположение, высоту и размер. Есть функция, которая возвращает True, если блок с текущей координатой (x, y, z) является частью горы. Если блок находится далеко от центра горы, True возвращается только в том случае, если координата z меньше максимальной высоты для расстояния от горы, т.е. чем дальше от горы находится блок, тем ниже максимальная высота. Таким образом, в центре горы максимальная высота высока, и True будет возвращено, даже если z велико (я использую систему z-up). Однако вдали от горы максимальная высота будет ниже.

Однако моя текущая функция (ниже) возвращает их линейно, и у реальных гор нет прямых сторон:

def isMountain(self, x, y, z, mountainPos, mountainSize, mountainHeight):
        if math.hypot(mountainPos[0] - x, mountainPos[1] - y) < mountainSize:
                if z < (mountainHeight - math.hypot(mountainPos[0] - x, mountainPos[1] - y)):
                    return True
                else:
                    return False

Строка 3 проверяет, меньше ли z максимальной высоты для позиции, если да, возвращает True, в противном случае - False.

Это максимальные высоты для расстояний:
Расстояние: максимальная высота
0 - 10
1 - 9
2 - 8
...
9 - 1
10 - 0

Как я мог бы переписать эту функцию, чтобы она возвращала больше гороподобных значений: не линейное, а скорее кубическое или плавное падение (например, в режиме пропорционального редактирования блендера), так что это давало бы значения, подобные этому:
0 - 10
1 - 9
2 - 9
3 - 8
4 - 7
5 - 5
6 - 3
7 - 1

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Если вы заинтересованы в выборе другого маршрута, вы можете использовать модифицированную версию перлин-шума для использования амплитуды и частоты, а затем использовать сглаживающий переход, чтобы получить то, что вы хотите. Вы можете установить точки, чтобы иметь общий диапазон высот, а затем позволить алгоритму шума делать свое дело для создания изменчивости между точками. Я сделал нечто подобное для создания современного мира с разными биомами, которые имеют разную высоту и форму гор.

0 голосов
/ 19 июля 2019

Может быть, вы могли бы использовать функцию обратного загара, как это

https://www.desmos.com/calculator/sn7tbepuxh

Где h - максимальная высота, s - крутизна, а x - расстояние от центра пика. -1 в конце позволяет игнорировать отрицательные значения, так что основание горы не будет длиться вечно.

Я использовал это для горного генератора для маленькой игры, и он, кажется, работает нормально, если вы не слишком резкими настройками крутизны и высоты для горы.

0 голосов
/ 16 мая 2018

Вы можете либо сломать голову, чтобы найти для этого какую-то математическую формулу, либо смоделировать процесс естественной эрозии. Обычно это делается с использованием сетки (матрицы, ячеек, ...) и итерации. По сути, вы начинаете с более или менее случайной возвышенности, а затем разрушаете ее, пока не сформируются горы, ну, на самом деле, горы - это то, что остается. Тем не менее, это обычно более затратно, чем использование простой функции, но на современных компьютерах это будет работать хорошо.

Также см .: https://www.gamasutra.com/blogs/MattKlingensmith/20130811/198049/How_we_Generate_Terrain_in_DwarfCorp.php

...