我在写类似木筏的游戏,用体素地形。
对于山脉,我指定一个位置,一个高度和大小。如果当前(x,y,z)坐标上的块是山的一部分,则有一个函数返回True。如果一个地块离山的中心很远,只有当z坐标在离山的最大高度以下(离一个块越远,最高的高度越低),才能返回真。因此,在山的中心,最高高度是高的,即使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
我如何重写这个函数,使它返回更多的山形值:不是线性的,而是立方的或平滑的掉下来的(比如搅拌器比例编辑模式),所以它会给出更像这样的值:
0- 10
1-9
2-9
3-8
4-7
5-5
6-3
7-1
发布于 2018-05-16 07:35:44
你可以打破你的头,找出一些数学公式,或你可以模拟自然侵蚀过程。这通常使用网格(矩阵、单元格、.)来完成。和迭代。基本上,你会从或多或少随机的高地形开始,然后侵蚀它直到群山形成,好吧,其实山才是剩下的。这就是说,这通常比使用一个简单的功能更昂贵,但是在现代计算机上,这是很好的。
发布于 2018-06-02 04:24:59
如果您有兴趣走另一条路线,您可以使用修改版本的perlin噪声使用振幅和频率,然后使用平滑过渡,以得到您想要的。你可以设置点,以有一个一般的高度范围,然后让噪音一直做它的事情,以创造之间的变化点。我做了一些类似的事情来创建一个有着不同类型的山高和形状的不同生物群落的inf世代世界。
发布于 2019-07-18 21:50:47
也许您可以使用这样的反tan函数
https://www.desmos.com/calculator/sn7tbepuxh
其中h是最大高度,s是陡度,x是距离峰值中心的距离。最后的-1允许忽略负值,这样山的底部就不会永远延伸。
我已经用它作为一个小型游戏的山地发生器,它似乎工作很好,只要你调整你的陡峭度和高度值的山不是太尖峰。
https://stackoverflow.com/questions/50162201
复制相似问题