Я пишу похожую на минкрафт игру с воксельным ландшафтом.
Для гор я указываю местоположение, высоту и размер. Есть функция, которая возвращает 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