9

我正在编写一个模拟,其中一个生物对象应该能够向环境中的其他任意对象移动,在障碍物周围滑动而不是进行任何智能寻路。我不想让它规划一条路径——只是朝着一个大方向移动,并绕过障碍物。

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

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

关于如何实现这个(或教程链接)的任何建议?

4

5 回答 5

6

Expanding on what Guillaume said about obstacle avoidance, a technique that would work well for you is anti-gravity movement. You treat local obstacles as point sources of antigravity, the destination as gravity, and your computer controlled character will slip (like soap!) around the obstacles to get to the destination.

于 2009-05-17T20:33:23.850 回答
5

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

seek:您在方向上施加转向力,该方向是当前速度与朝向目标的所需速度之间的差值

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

您可以在“自主角色的转向行为”网站上找到更多信息

问候

纪尧姆

PS:这假设您正在使用点/速度/加速度方法来进行对象的运动。

于 2009-05-17T20:11:39.237 回答
2

也许你可以使用Pledge 的算法

于 2009-05-17T16:25:28.440 回答
1

每当您的生物在向量方向 移动v时与方向由向量表示的墙壁发生碰撞w,您需要“滑动”的方向由向量给出,该向量是 on 的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*,但如果您的环境具有足够的结构,这可能是不必要的。

于 2009-05-17T16:32:59.500 回答
-1

不久前我在 C# 中发布了一个寻路算法

这是链接

您可以尝试将其用作起点,即您可以修改检查下一个单元格的函数以查看检查障碍物是否有效,并且您可以将其输入小间隔而不是起点和终点,有点像多条迷你寻路路线。

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

于 2009-05-17T16:05:49.737 回答