如何像 Tiny Wings 那样生成不同高度和宽度的连绵起伏的丘陵?现在我正在使用 sin() 但它显然会生成永远重复的均匀山丘。
秘诀是什么?
谢谢!
如何像 Tiny Wings 那样生成不同高度和宽度的连绵起伏的丘陵?现在我正在使用 sin() 但它显然会生成永远重复的均匀山丘。
秘诀是什么?
谢谢!
当然不是程序生成专家 - 但您可以尝试将多个随机生成的具有不同周期的 sin/cos 函数相加组合。添加的越多,看起来就越随机。
像这样的东西。
单纯形噪声,或任何其他看起来像您喜欢的 2d 噪声函数。
如果您打算使用正弦波来完成此操作以创建此变化,这里是如何操作正弦函数的基本概述:
假设你有一个 x 轴、y 轴和一个正弦波y = sin(x)
y = sin(x * 0.5)
使正弦波穿过 x 轴的频率减半(频率)
y = 0.5 * sin(x)
使正弦波达到一半的高度(幅度)
y = 0.5 + sin(x)
将正弦波的中心轴沿 y 轴向上移动 0.5(平移/偏移)
使用这三个属性,您可以构建各种不同外观的波浪。
现在,诀窍是您必须叠加这些波以随着时间的推移产生变化。一个简单的方法是把波浪加在一起,
y = sin(x * 0.5) + 0.5 * sin(x) + (0.5 + sin(x))
或者,您可以在 x 轴的特定子集上定义不同的波,并创建分段函数。这可能更可控/艺术指导:
y = {
sin(x * 0.5) for x in (0, 5],
0.5 * sin(x) for x in (5, 10],
0.5 + sin(x) for x in (10, 5] }
但是,如果您尝试这样做,您会注意到这会在您的波浪中产生不连续性。您应该研究不同的混合选项(首先查看线性混合),看看是否可以在这些分段函数之间创建平滑过渡。
但是,在我看来,你还应该研究样条曲线,看看它们是否能完成你想要的。样条曲线是图形和游戏编程的有据可查的部分,因此它很容易实现(或获取其他人的代码),并且可能提供一种更直观的方式来创作您的关卡(生成代表节点/控制点的随机点集,并通过它通过样条)。