我正在寻找有关如何在2D空间中实现跟踪的想法。不幸的是,我对AI /路径查找/自主控制了解不多。
假设这艘船可以自由移动,但它具有质量和动量。同样,外力可能会影响它(爆炸等)。玩家可以随时为飞船设定目标,并且该目标应到达该地点并停止。
没有物理学,这将很简单,只需指出方向即可。但是,如何应对现有的势头然后停下来呢?我不想直接修改船的位置。
编辑:只是要弄清楚,与船舶本身的物理相关的数学并不是问题。
我正在寻找有关如何在2D空间中实现跟踪的想法。不幸的是,我对AI /路径查找/自主控制了解不多。
假设这艘船可以自由移动,但它具有质量和动量。同样,外力可能会影响它(爆炸等)。玩家可以随时为飞船设定目标,并且该目标应到达该地点并停止。
没有物理学,这将很简单,只需指出方向即可。但是,如何应对现有的势头然后停下来呢?我不想直接修改船的位置。
编辑:只是要弄清楚,与船舶本身的物理相关的数学并不是问题。
Answers:
完全正确并非易事。尽管每种解决方案的细节各不相同,但您有两种选择:
数学解决方案。如果您的物理系统足够简单,则可以为运动创建闭合形式,并计算何时需要开始施加制动力以停止在某个点。如果制动力是恒定的并且没有空气阻力,则应该分解为平方。
正确的解决方案。您可以使用手动调整的PID控制器,也可以在物理系统中实际记录船舶的制动距离:在测试台上,将船舶从最大速度制动到停止,记录行进的距离和每小步长的速度。将所得的距离/速度图存储在数据目录中。
在运行时,重新构建图形并插入当前速度和目标速度以求出一定距离。在距目标点此距离处,您需要完全刹车。
这种方法的优点是您可以使用它来精确地制动到任何速度。缺点是,如果您的制动器必须打开或关闭,则您永远不会完全弯道。
如前所述,这种情况非常适合操纵行为,但我只想在此稍加扩展。对于这种情况,到达行为将是完美的。您可能还需要考虑障碍。您也可以在此处使用“避障”行为。
不幸的是,http://www.red3d.com/cwr/steer/没有提供有关行为的源代码。但是,《示例编程AI》以易于理解的块的形式进行并解释了这些行为。如果您无法获得该书,则始终可以在此处获取源代码:http : //www.wordware.com/files/ai/
此外,如果您想扩展运动以包括寻路,则可以使用一个路径查找器类来计算路径(也许是2D向量的集合),并使用“路径跟随”转向行为将其也添加到混合中。
我链接到的源代码还提供了三种将这些转向行为组合在一起的不同方法。
希望能有所帮助。
转向某个位置并不是很困难,但我个人在转向某个位置并以特定速度到达该位置或遵循速度受限的路径时遇到了一段时间。
我使用Hermite曲线解决了问题。将p0和m0设置为船舶的位置和速度,将p1和m1设置为目标位置和速度。假设您希望飞船跟随目标一秒钟。计算p(0)的二阶导数,这将为您提供应用于船舶的加速度。
这是二阶导数的代码(在F#中,我希望您可以使其适应所选的语言; sq()计算平方,单引号而不是引号,而是字符,它们是标识符的一部分):
let h'' t =
let h00'' t = 12.0 * t - 6.0
let h10'' t = 6.0 * t - 4.0
let h01'' t = -12.0 * t + 6.0
let h11'' t = 6.0 * t - 2.0
let t = (t - t0) / diff_t
(sq (1.0 / diff_t)) *
((h00'' t * p0) +
(h10'' t * diff_t * v0) +
(h01'' t * p1) +
(h11'' t * diff_t * v1))
请注意,如果您的船受到外力(例如来自行星的重力),则在根据加速度计算推力时必须考虑到这一点。
最近发现这一点-JavaScript和处理中的转向行为:
我认为您的飞船应具有以下参数:位置和速度。
速度是所有力(例如重力,爆炸,用户输入等)在每帧中的总和,并且也可以具有某种阻尼。
根据最后一个位置加上速度* time_step来计算位置。
但是,这样做可能会难以实现目标停止。