生成不同高度和宽度的连绵起伏的丘陵像Tiny Wings?

时间:2012-01-09 05:30:39

标签: math language-agnostic procedural

如何像Tiny Wings一样生成不同高度和宽度的连绵丘陵?现在我正在使用sin(),但它显然会产生永恒而永远重复的均匀山丘。

秘密是什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

当然不是程序生成专家 - 但您可以尝试将多个随机生成的sin / cos函数与不同时期相加。你添加的越多,它就越随机。

类似于this

答案 1 :(得分:1)

Simplex noise,或其他任何看起来像你喜欢的噪音函数。

答案 2 :(得分:0)

如果你开始使用正弦波来创建这种变化,那么这里是如何操作正弦函数的基本概述:

假设您有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] }

但是,如果你试试这个,你会注意到这会在你的波浪中产生不连续性。您应该研究不同的混合选项(首先查找线性混合),看看是否可以在这些分段函数之间创建平滑过渡。

但是,在我看来,你还应该调查spline curves,看看他们是否能达到你想要的效果。样条曲线是图形和游戏编程的一部分,因此它很容易实现(或者获取别人的代码),并且可能提供更直观的方式来创建您的关卡(生成一组代表结的随机点) /控制点,并通过它传递样条曲线。)