连续二维空间中避障的基本寻路

时间:2009-05-17 16:03:19

标签: xna 2d collision-detection path-finding

我正在编写一个模拟,其中生物对象应该能够移动到环境中的其他任意对象,在障碍物周围滑动而不是进行任何智能寻路。我不是想让它计划一条路 - 只是向一个方向移动,然后在障碍物周围反弹。

这是一个2D环境(俯视图),每个对象都有一个用于碰撞检测的边界矩形。没有网格,我不是在寻找A *解决方案。

我无法找到关于这种“哑”基于碰撞的寻路的任何教程,所以我可能不会使用最常见的术语来描述它。

有关如何实现此建议的任何建议(或指向教程的链接)?

5 个答案:

答案 0 :(得分:6)

扩展纪尧姆关于避障的说法,一种适合你的技术是anti-gravity movement。你把当地的障碍视为反重力的目标来源,重力的目的地,你的计算机控制的角色会在障碍物周围滑动(如肥皂!)到达目的地。

答案 1 :(得分:5)

你可以结合两种转向算法:

搜寻:在当前速度与目标速度之间的差值方向施加转向力

避障障碍:您使用长度为恒定时间乘以车辆当前速度的方框预测车辆的未来。与此框相交的任何障碍都是潜在的碰撞威胁。选择最近的这种威胁是为了避免。为了避开障碍物,在障碍物中心的对面施加横向转向力。另外,施加制动(减速)力。这些力随紧急程度(从箱尖到可能碰撞点的距离)而变化。转向线性变化,制动呈二次方变化。

您可以在网站“Steering Behaviors For Autonomous Characters

上找到更多信息

问候

纪尧姆

PS:假设您正在使用点/速度/加速度方法来对象移动。

答案 2 :(得分:2)

也许你可以使用Pledge's algorithm

答案 3 :(得分:1)

每当你在矢量方向v上行进的生物与一个方向由向量w表示的墙碰撞时,你需要“滑动”的方向由向量{将v投射到w上。这可以使用

找到
  v . w
--------- w
 |w|*|w|

其中.vector dot product|w|是向量w(= sqrt(w . w))的幅度。如果w是单位向量,则只需

(v . w) w

使用生成的矢量作为你的生物的速度意味着你的生物只是“掠过”墙壁时会快速移动,而当它几乎死亡时会慢慢地撞到墙壁上。 (这是大多数第一人称射击游戏管理人类玩家碰撞的方式。)

如果你希望你的生物总是全速旅行,你只需要v . w的标志 - 你将始终沿着墙面方向(w)或者相反的方向(-w)。

你将遇到的问题是你的生物何时撞到了墙上。在这种情况下,您的投影向量将为(0,0),您需要一些其他技术来决定走哪条路(w-w)。这里通常的方法是A *,但如果您的环境具有足够的结构,这可能是不必要的。

答案 4 :(得分:-1)

我在C#a中发布了寻路算法

Here's the link

你可以尝试使用它作为起点,也就是说,你可以修改检查下一个单元格的功能,看看它是否有效检查障碍物,你可以用很小的间隔来代替起点和终点点,有点像多条小型路线。

(文字是西班牙语,但你可以从顶部的链接下载应用程序)

相关问题