山区衰减函数

2024-09-28 05:19:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写mincraft类似体素地形的游戏。在

对于山,我指定了位置、高度和大小。如果当前(x,y,z)坐标处的块是山的一部分,则有一个函数返回True。如果一个块远离山的中心,只有当z坐标低于离山距离的最大高度(即块离山越远,最大高度越低),才会返回True。所以在山的中心,最大高度是高的,即使z很高也会返回True(我使用的是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

如何重新编写此函数以使其返回更多山形值:不是线性的,而是立方的或平滑的衰减(如blender Proportional编辑模式),因此它将给出更像这样的值:
0-10
1-9
2-9
3-8
4-7
5-5
6-3
7-1个


Tags: 函数falsetrue距离returnif高度线性
3条回答

也许你可以用这样的反tan函数

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

其中h为最大高度,s为陡度,x为距峰值中心的距离。末尾的-1允许忽略负值,这样山脚就不会永远延伸。在

我在一个小型游戏中使用了这个软件作为一个山生成器,它似乎工作得很好,只要你把你的陡峭度和高度值调整到山上不是太尖利。在

你可以打破你的头找到一些数学公式,或你可以模拟自然侵蚀过程。 这通常是通过网格(矩阵、单元格等)和迭代来完成的。 基本上你会从或多或少随机的高地开始,然后侵蚀它,直到山脉形成,实际上,山就是剩下的东西。 这就是说,这通常比使用一个简单的功能要昂贵,但在现代计算机上,这将是很好的工作。在

另请参见:https://www.gamasutra.com/blogs/MattKlingensmith/20130811/198049/How_we_Generate_Terrain_in_DwarfCorp.php

如果你有兴趣走另一条路,你可以使用一个修改版的柏林噪声使用振幅和频率,然后使用平滑过渡来得到你想要的。你可以设置点有一个一般的高度范围,然后让噪音算法做它的事情,以创造不同点之间的可变性。我做了一些类似的事情来创建一个具有不同生物群落的inf-gen世界,这些生物群落具有不同的山高和形状。在

相关问题 更多 >

    热门问题