我正在编写一个模拟,其中生物对象应该能够移动到环境中的其他任意对象,在障碍物周围滑动而不是进行任何智能寻路。我不是想让它计划一条路 - 只是向一个方向移动,然后在障碍物周围反弹。
这是一个2D环境(俯视图),每个对象都有一个用于碰撞检测的边界矩形。没有网格,我不是在寻找A *解决方案。
我无法找到关于这种“哑”基于碰撞的寻路的任何教程,所以我可能不会使用最常见的术语来描述它。
有关如何实现此建议的任何建议(或指向教程的链接)?
答案 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中发布了寻路算法
你可以尝试使用它作为起点,也就是说,你可以修改检查下一个单元格的功能,看看它是否有效检查障碍物,你可以用很小的间隔来代替起点和终点点,有点像多条小型路线。
(文字是西班牙语,但你可以从顶部的链接下载应用程序)