<@乌龟:>[翻译]开放街道下的竞速类游戏人工智能(2)

 

建立交通:

         使用三次样条插值创建道路.在通常的驾驶情况下,所有的车辆斗是按照二维下的曲线来放置的.这条曲线定义了交通工具在XZ平面上驾驶的精确路线.我们使用Hermite曲线作为我们的插值样条,因为定义的参数,开始,结束的点和方向向量很容易计算,也有不错的可读性.(译者按:其实使用Catmull-rom样条一样可以完成我们的要求,而且Catmull-rom的样条应用更广一些).

         既然每条道路的车道是由一个顶点列表构成,一条道路的子段能够方便的从这个顶点序列中取出.当一辆车从一段道路走到另一段道路的时候,新的样条曲线将会计算用来表示这辆车下个时间将会行驶的路径.样条也能够在当车辆需要驶回(recovery routes)原先道路的时候起到作用.这类驶回道路在当道路发生碰撞,汽车被玩家挤出赛道之后,返回时候使用.使用样条能够使得其他的车辆能够沿着曲线平滑的驾驶.

         建立道路的最高速度限制:奔欲.AI的每条道路都有一个速度限制来决定交通工具能够在这条道路上开多块.另外,每辆车都有一个随机的值用来决定它行驶速度超过或者低于限制速度的值.这个可正可负的值可以使得电脑的交通工具可以以不同的速度来行驶(保持真实感).

         当某辆车需要加速的时候,它使用一个从5.m/s^2~8.m/s^2的一个随机值.另外,当交通工具需要减速的时候,可能是碰到了停止标志(stop sign),或者红绿灯时,它将会计算1秒后达到目标速度时需要给予的加速度值.加速度由下面的公式给出:

(V2 - V02) / 2(X - X0)

V为目标速度,V0为当前速度,(x-x0)为需要完成这次减速的距离.

碰撞检测.CPU时间分配很紧张的时候,一辆交通工具不能对其他所有的交通工具都进行碰撞检测.在性能和效果中去一个折衷的方式:每辆车仅仅保存一个指向它所在道路正前方的一辆车.在每一帧的时间内,每辆车检查自己与前面那辆车的距离是不是太近,如果是的话,后面那辆车将会减速.当两者间的距离足够远之后,后面那辆车将会以原有的速度行驶.

这种简化算法将会导致多辆车连环相撞的问题,我们可以在他们发生连环相撞之前,把他们停下来,这个问题就解决了(The problem can be solved by stopping the ambient vehicles at the intersections preceding the crash scene,可能应该这样翻译吧,呵呵.)

穿越路口.当一辆车到达了一条道路的终点后,它必须穿越一个路口.为了穿越路口,交通工具通过下面的四个条件:

1)    交通工具必须得到道路的交通管制上的认可.道路汇合的路口处包含了描述了该条道路的交通管制,一些合适的管制类型为:不许停(NoStop),总是停(AllwaysStop),交通灯,停止标志(StopSign)(见图二).如果总是停标志被设置了,交通工具永远不能得到进入这个路口的批准.如果交通灯被设置了,交通工具将在他所在方向为绿灯的时候允许进入路口,停止标志设置的时候,交通工具将等待很长的时间以穿越这个路口.

 

Figure 2:在这个情况下,TrafficLight类对一些交通工具设置为红灯,不让通行,对其他的交通工具设置为绿灯/黄灯,让他们可以穿越路口,在左边的车道,车将向左转,在右边]]的车道,车将直行.

2)    第二个审批环节(approval group)是事故管理器.事故管理器保存着所有在这个路口及其相连的道路上车辆的行驶路线.如果这里出现了任何的事故,那么申请通过这个路口的请求将会被拒绝.如果没有什么事情发生,那么交通工具将会进行第三个环节的审批.

3)    第三个环节需要检查是否这辆车需要进入的下一条路有足够的空间容纳他,至少能够使得它在进入这条路之后不会有一半还在路口处

4)    第四个环节检查是否有其他的交通工具试图穿越这个路口.我们举一个例子来说明它的必要性:当一辆车从一条由停止标志(stop sign)控制的路转到一条由交通灯控制的主干道上时.因为停止标志允许通行是基于在路口的等待时间的,但是事实上这个车需要等到主干道上的交通灯允许通过的时候才允许它离开当前的道路(译者按:其实作者这个例子举得不算直观,用红绿灯来作为条件检查是否有其他的交通工具试图穿越,其实还有一些情况可能会出现)

 

-----------

乌龟和毛驴的技术小屋原创,转载请注明出处

posted on 2009-01-29 20:18  乌龟_毛驴  阅读(1286)  评论(6编辑  收藏  举报

导航