生成随机隧道

时间:2012-09-28 20:18:28

标签: algorithm random

我们可以使用哪些方法生成随机隧道,类似于this classic helicopter game中的方法?除此之外,它应该是平滑的,并允许你浏览它,虽然看起来尽可能自然(不太对称,但也没有过度扭曲),它还应该:

  1. 最重要的是 - 无限,让我及时控制它的厚度 - 当我认为合适的时候,让它变得更窄或更宽;
  2. 理想情况下,应该可以使用平滑曲线高效生成它,而不是像上面游戏那样的矩形;
  3. 我应该事先知道它的界限是什么,所以我可以检测到碰撞并在隧道内产生通电;
  4. 欢迎任何其他让您对其拥有更多控制权或提供优化可能性的属性。
  5. 注意: 我不是要求哪个最好或游戏使用什么,这可能引发扩展讨论并且是主观的,我只是要求其他人知道或使用过的某些方法,或者甚至认为它们可能有效。就是这样,我可以从那里拿走它。

    另外asked on gamedev。我认为它适用于这两个地方,因为它是一个算法问题,因为它是一个gamedev问题,IMO。

2 个答案:

答案 0 :(得分:3)

我认为您可以将Bézier curves用于隧道墙,因为它们具有以下属性:曲线的每个末端都与该末端最后两个控制点之间的线段相切。这意味着可以懒散地生成曲线,随意附加曲线,而不会产生尖角。您只需缓冲一个屏幕外部分。一旦其最左边缘出现在屏幕上,就创建下一个离屏段。

如果使用立方贝塞尔曲线,则需要4个控制点。第一个必然与前一个段的最后一个控制点相同;为了保持交界处的平滑度,第二个将需要在包含前一个分段的最后2个控制点的线上的某个位置;第四个将是你希望这条曲线结束的地方;第三个可以自由选择。 (您可能希望在第1点和第4点之间保持水平,以避免曲线“加倍”的可能性。)

Béziers有2个其他属性可以简化您的实施:

  • 曲线完全包含在由控制点定义的凸包内,因此很容易确保顶曲线和底曲线之间存在间隙。
  • 您可以在任何时候拆分Bézier以产生2个Bézier。这对于光栅化/线性化非常方便。

编辑:用“凸包”替换“边界框”。

答案 1 :(得分:2)

确定隧道的宽度(它可能随距离减小),然后将2个控制点放在随机高度,但要确保前一对或多个点的垂直偏移足够小,以便直升机能够做一个机动。继续以相等的距离添加控制点:

     _  
_         _    _

     _         _
_         _    

接下来你需要找到中间点。我使用单调立方插值,它保证所有中间点始终在控制点之间,从不低或高。这是我用JavaScript制作的演示:http://explored.tk/experiments/monotone/

UPD:或者您可以生成一条这样的曲线,然后围绕它绘制对称的隧道边界。