导航网格中的“视线”路径


9

我想计算导航网格中的视线。

考虑下图,黄线仅是A *的结果,红线是使用黄线作为输入的“视线”算法的结果。现在,设备可以直接移动而无需“曲折”。

计算该“视线”的算法是什么?

在此处输入图片说明

Answers:


6

您正在寻找漏斗算法。

这是一个简单的

http://digestingduck.blogspot.com.es/2010/03/simple-stupid-funnel-algorithm.html

基本上,该算法将边标识为门户,并构建一个针对边的顶点进行测试的漏斗,以检查边是否在漏斗内。

在步骤A中,以起始位置和黄色虚线交叉的门户构建渠道。

在步骤B中,检查下一个门户,上顶点在漏斗内,因此漏斗上线现在通过该漏斗。但是底部顶点不在漏斗中,因为红色线在绿色线之下,因此底部线不会穿过它,它将继续穿过先前门户的底部顶点。

正如您可以检查的那样,漏斗会越来越小,直到无法进行漏斗的步骤F,因为红线表示漏斗不好,所以选择了上顶点作为新的起点,并且会选择新的漏斗如果端点不在该网格中,则进行构建。

在此处输入图片说明

意识到这种算法也为模型尺寸问题提供了一种简单的解决方案,因为您可以认为门户比模型的2倍半径小。

在此处输入图片说明


6

有一种简单的技术可以使用这种视线思想与生成的路径一起使用。基本上,您要走这条路,在每个节点上,“回头” 查看最后一个节点之前的两个节点,以查看是否可见。如果可以看到最后一个节点之前的节点,则可以删除最后一个节点(因为在当前节点和最后一个节点之前的视线之间没有视线,因此不需要最后一个节点(作为中间节点))。

在此处输入图片说明

Gamasutra的文章具有以下伪代码示例:

checkPoint = starting point of path
currentPoint = next point in path
while (currentPoint->next != NULL)
if Walkable(checkPoint, currentPoint->next)
// Make a straight path between those points:
temp = currentPoint
currentPoint = currentPoint->next
delete temp from the path
else
checkPoint = currentPoint
currentPoint = currentPoint->next

该算法可以根据您的需要进行操作,该Walkable函数本质上是视线函数,但对其进行了稍微改进,以包括路径可见但不适合步行的情况(例如坑,陷阱,限制区域)。


我明白您在说什么,但我仍然不知道如何计算视线。您能否使用三角形导航网格描述Walkable函数中的内容?
Yannick Lange 2014年

这个答案是关于基于网格的路径,在导航网格场景中没有用
Blau 2014年
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.