碰撞100%避免实施


21

我绝对是游戏开发的初学者,而且我对避碰/解决冲突一无所知,在过去一周中,我是该网站通过此网站学到的...因此,如果我要问的是什么,请立即纠正我。基于错误的假设/误解。我尽力弄清楚了,但是那句话对我来说仍然是新颖的。

车辆

在我的游戏中,我有可以自动行驶的车辆。它们被放置在3D空间中,它们的运动由许多变量决定,这些变量对于每个车辆而言都是不同的。这里感兴趣的一个主要是:

  • 向前运动。
  • 速度,可以最小和最大,但其min是之间变化(甚至接近)零。
  • 转向半径,其取决于从速度(更高的速度,更大的半径)
  • 两个最大加速度(用于降低和增加速度)

目标

我的目标是实现某种能够100%准确避免碰撞的AI (即,我将确保车辆永远不会碰撞)。

设计

  • 尽管我更喜欢将AI“车载”的想法(即每辆拥有自己的“防撞AI”的车辆,最终查询和/或向其他车辆发送消息),但我仍然可以在以下位置实现CA AI:中央层(向车辆调度命令)。
  • 在大多数情况下,车辆仅需在任何方向上相互避开,但在某些情况下,它们将必须避免碰撞并朝着同一目标行驶

到目前为止我发现的东西以及被卡住的地方

在这个站点上其他问题中找到的许多链接中,我发现特别有用的链接有:

  1. 撞球之间的碰撞
  2. 避免意外碰撞
  3. 排队

虽然这三个链接以许多方式“打开了我的视线”,但我仍然不清楚如何在我的情况下使用该信息。特别是在第2条中,只有“尝试”才能防止冲突(但是冲突确实会不时发生)。虽然第3条有时需要停车以防止碰撞。

我还注意到的是,上面链接的避免碰撞算法使用线速度“即时投影”来检查车辆是否在行驶中。我想知道这是否足以满足我的需要,或者是否必须以更现实的方式来投影我的位置(例如:如果我将60°转向右90°,则我应该计算其余位置的位置曲线的30°,然后假设是线性运动)。

最后,我特别担心僵局。换句话说:尽管世界上的车辆密度会很低,但我担心,如果一定数量的车辆向同一点汇合,一旦他们意识到自己正在碰撞,就不可能进行任何规避操作因为它将使车辆与其他碰撞路径碰撞。

我怎样才能达到我的“目标”?深入理解当然是非常值得赞赏的,但是与外部资源的链接也将有很大帮助(我肯定不是第一个遇到此问题的人,但是可能我使用了错误的关键字来搜索网络吗? )

预先感谢您的帮助!


20
让所有车辆停下来。避免了100%。
Martin Sojka,

2
如果他们彼此停止就足够了。也就是说,它们都以完全相同的方向以完全相同的速度移动。更大的问题是,(证明)不可能实现任何可能对每种可能的配置以100%的速率执行的算法。例如,考虑两辆具有非常大的转弯半径的车辆,它们之间的最小距离不等于零,并且彼此之间以最大速度飞行。
Martin Sojka,

12
@mac-在开发此算法时要记住的一件事是“这是一个游戏”。如果您花费太多时间尝试解决此问题,则可能是您尝试解决错误的问题。如果发现困难的情况,尤其是玩家看不到的话,您可以作弊-移动车辆或违反其处理规则。确保您提出的任何车辆处理规则都不会看起来很无聊,娱乐性比正确性更重要。
翻转

3
@mac好吧,我可能会使用带有A *的全局控制器。我知道您想避免使用此解决方案,但由于它具有车辆的全局视图并且可以预先计算路径,因此更有意义。您可能还希望对车辆设置优先级(最接近目标的车辆具有更高的优先级,因此其路径保持不变,而其他车辆则绕着该路径重新行驶)。
乔纳森·康奈尔

6
@Flip飞行模拟器仍然被认为是游戏,但是如果您“作弊”,它将对意识到这一点的任何玩家造成破坏。
乔纳森·康奈尔

Answers:


5

您是否研究过植绒算法?当我查看您的描述时,这就是我想到的。周围有很多文章,这是我喜欢的文章。您可能不会使用植绒的所有方面,例如凝聚力。大多数方面对于您尝试做的事情都是有用的,例如对齐和分离,这两个方面都将有助于避免冲突。您最终会得到一些不同于植绒的东西,但是它应该可以帮助您入门。

祝好运!


2
此处的相关搜索词是Boids。但是,我认为这不是OP想要的-听起来更像是他希望汽车以任何方式行驶。
BlueRaja-Danny Pflughoeft

植绒仍然是AI避免彼此碰撞的关键。
马特·延森

OP要求可靠地避免碰撞。植绒不能保证,因为基于力的模型不包含硬约束。尽管植绒无疑是进入该主题的一个很好的切入点,但是答案却错位了。我建议OP寻找“速度障碍”。
Tobias Gurdan

@TobiasGurdan如果您有一个更合适的答案(并且我同意这样做),则应该创建一个答案。
MichaelHouse

3

这是一种方法:每辆车都有一条短的投影路径,最终车辆减速并进入环路,这些路径可能不会重叠。每当车辆到达设置为减速的位置时,您都尝试生成不与任何现有路径重叠的新路径。如果发现不可能,则车辆继续在给定的路径上行驶,然后重试并定期创建新路径。

通过使导致环路的路径彼此重叠并且可以确定不会造成冲突的环路,可以改进该方法以允许更严格的流量。


0

在每辆车中都有一种方法,可以对其周围进行径向搜索,如果在此半径内还有其他车辆,则以适合您的方式移动:1)沿相反方向移动; 2)减速; 3)加速等

您甚至可以进行组合:如果另一辆车的矢量不在直线前方或后方:否则就直说:放慢脚步;否则:加快速度。


0

我的目标是实现某种能够100%准确避免碰撞的AI(即,我将确保车辆永远不会碰撞)。

如果可能的话,到现在世界上所有的飞机都将使用它。

我建议放松“自主”方面,并具有解决2个(或更多)车辆之间的预计碰撞的功能。像随机选择新的方向行驶并查看是否可以解决问题一样幼稚,但是重要的是该功能仅在达成适合两种车辆的协议时才返回。

我还建议,在不久的将来会发生碰撞的任何车辆都可以降低速度,同时保持相同的超前距离-这将为您的车辆提供更多避免碰撞的机会,就像在现实生活中一样。


由于他正在设计宇宙规则,所以这是绝对可能的。现实世界显然要复杂得多,但我敢肯定,现实世界中的飞机确实会使用大量避免碰撞的技术……
BlueRaja-Danny Pflughoeft

0

在我看来,人群模拟可能是与您要实现的目标最相关的主题。UNC的GAMMA小组在该主题上有大量工作可能值得研究。他们的描述:

人群和多主体仿真是模拟大量人,生物或其他角色的过程,每个人,生物或其他角色在一个环境中进行交互。期望这些行为者朝着自己的目标迈进,与环境互动,并相互回应。人群模拟有许多用途,包括改善建筑规划,改善培训环境和虚拟现实,以及 在游戏和电影中驾驶人工智能(AI)角色。我们的小组研究了人群模拟中的许多问题,包括快速,有保证的,避免碰撞,实时路径和运动计划,人群流动和定向行为。

http://gamma.cs.unc.edu/research/crowds/


-1

我不认为有100%的回避方法,但是如果您的车辆拥有完整的世界信息,则可以将每辆车装进一个盒子,盒子的长度取决于车速,并在这些盒子上进行碰撞检查。如果确实存在碰撞,则根据碰撞的迫切性(或两个盒子之间的碰撞面积)和缓慢的转向速度(但在回避操作期间将盒子保持相同的长度)转向。

显然,如果车辆不具备完整的信息,这将行不通,但是在这种情况下,任何事情都不能保证100%避免(平行运动除外)

此处介绍的某些方法可能会有用,尤其是以下一种方法:未对齐的防撞转向行为

问候


1
您读过原始问题吗?您建议的链接已经在问题中了……
bummzack 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.