Xna 连续二维空间中具有避障功能的基本寻路

Xna 连续二维空间中具有避障功能的基本寻路,xna,2d,collision-detection,path-finding,Xna,2d,Collision Detection,Path Finding,我正在写一个模拟,在这个模拟中,一个生物对象应该能够向环境中的其他任意对象移动,绕过障碍物滑动,而不是进行任何智能寻路。我并没有试图让它规划一条道路——只是朝一个大致的方向前进,绕过障碍物 这是一个2D环境(俯视图),每个对象都有一个用于碰撞检测的边框。没有网格,我也不是在寻找解决方案 我还没有找到任何关于这种“愚蠢的”基于碰撞的寻路的教程,所以我可能没有用最常用的术语来描述它 关于如何实现这一点有什么建议吗(或者链接到教程)?我不久前用C#a发布了一个寻路算法 您可以尝试将其用作起点,也就是

我正在写一个模拟,在这个模拟中,一个生物对象应该能够向环境中的其他任意对象移动,绕过障碍物滑动,而不是进行任何智能寻路。我并没有试图让它规划一条道路——只是朝一个大致的方向前进,绕过障碍物

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

我还没有找到任何关于这种“愚蠢的”基于碰撞的寻路的教程,所以我可能没有用最常用的术语来描述它


关于如何实现这一点有什么建议吗(或者链接到教程)?

我不久前用C#a发布了一个寻路算法

您可以尝试将其用作起点,也就是说,您可以修改检查下一个单元格的功能,以查看它是否可以有效地检查障碍物,您可以按较小的间隔向其提供信息,而不是起点和终点,有点像多条迷你路线


(文本为西班牙语,但您可以从顶部的链接下载该应用程序)

当您的生物以矢量方向
v
行进时,您可以使用,该方向由矢量
w
表示,您需要“滑动”的方向由向量给出,该向量是
v
w
的投影。这可以使用

  v . w
--------- w
 |w|*|w|
其中,
是向量的大小,
|w |
是向量
w
(=
sqrt(w.w)
)。如果
w
是一个单位向量,那么它就变得简单

(v . w) w
使用结果向量作为你的生物的速度将意味着你的生物在“擦”墙时移动得很快,而在撞到几乎死掉的墙上时移动得很慢。(这是大多数第一人称射击游戏为人类玩家管理碰撞的方式。)

如果你希望你的生物总是全速行进,你只需要
v的符号。w
——您将始终沿着墙面的方向(
w
)或相反方向(
-w
)移动


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

您可以组合两种转向算法:

寻道:在当前速度与目标所需速度之差的方向上施加转向力

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

您可以在网站“”上找到更多信息

问候

纪尧姆


PS:假设你正在使用点/速度/加速度方法来移动物体。

进一步阐述纪尧姆所说的避障,这是一种适合你的技术。您将局部障碍物视为反重力的点源,目的地视为重力,您的计算机控制角色将在障碍物周围滑动(如soap!)以到达目的地。

在负方向,您必须具有大于要避免的对象的反重力场,以便在车辆到达障碍物之前开始转弯。因此,您可以有一个配置,在该配置中,您获得的加速度直接与所需的加速度相反(前面有两个障碍物,取消了每个横向加速度,并覆盖了目标的前向加速度),这对移动的障碍物很有效。虽然理论上两个障碍物可以相互抵消,但实际上这不太可能而且不稳定。。。只要稍微改变一下位置,你就会绕过障碍物。如果这是一个问题,你可以用随机噪声来应对。在我的例子中,反重力解决方案看起来是一个不错的选择。这很简单,计算也很简单。我不要求保证特工在第一次尝试时就能到达目标,所以如果他们被障碍物阻挡也没关系(尽管偶尔随机施加额外的力量也可以解决这个问题)。我同意这是不稳定的,不太可能的。我之所以提到它,是因为我在一个案例中使用了这个解决方案,玩家可以非常精确地放置“防御”,而我们的测试显示这是一个骗局。我没有想过添加随机噪声:(该物体很容易卡在其他物体之间,例如两堵相邻的墙。它不适合在迷宫中航行;在L形建筑物和其他此类障碍物周围移动。它不适合在建筑物内,例如需要爬楼梯的FPS中的AIs。但是,它适用于大型o有着人烟稀少障碍物的笔距。引用原始问题:“我不想让它规划一条道路”,这应该是答案。至少它是基于AAA游戏中使用的经验证的概念。加上克雷格·雷诺兹(Craig Reynolds)非常棒