Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何找到投射光线的位置以避免子弹碰撞?_C++_Algorithm_Path Finding_Bullet_Raycasting - Fatal编程技术网

C++ 如何找到投射光线的位置以避免子弹碰撞?

C++ 如何找到投射光线的位置以避免子弹碰撞?,c++,algorithm,path-finding,bullet,raycasting,C++,Algorithm,Path Finding,Bullet,Raycasting,假设我们在A点有一个物体,它想知道它是否能移动到B点。它的速度有限,所以只能一步一步地移动。它在移动方向投射光线。光线与物体碰撞,我们检测到它。如何找到安全通过射线(避免碰撞)的方法 顺便问一下,有没有一种方法可以让这种东西在物体投射的情况下工作,它会像简单的光线投射一样/几乎一样快 有没有办法在某个路径中找到最优的 一个简单的方法如何开始 如果这只是一个对象,则可以计算障碍物所有顶点的凸包,以及起点和终点。然后,通过顺时针和逆时针遍历船体,检查从A到B的两个方向。选择最短路径 它有点复杂,

假设我们在A点有一个物体,它想知道它是否能移动到B点。它的速度有限,所以只能一步一步地移动。它在移动方向投射光线。光线与物体碰撞,我们检测到它。如何找到安全通过射线(避免碰撞)的方法

顺便问一下,有没有一种方法可以让这种东西在物体投射的情况下工作,它会像简单的光线投射一样/几乎一样快

有没有办法在某个路径中找到最优的


一个简单的方法如何开始

如果这只是一个对象,则可以计算障碍物所有顶点的凸包,以及起点和终点。然后,通过顺时针和逆时针遍历船体,检查从A到B的两个方向。选择最短路径

它有点复杂,因为你移动的形状不仅仅是一个点。你不能盲目地移动它的中心,否则它会相撞。当它经过一个顶点时,它变得更加复杂,因为你必须靠着障碍物的顶点擦去你物体的一条边


但希望这能给你一个想法去思考,这在概念上并不难理解。

一种方法可以是使用一根绳子,或几根绳子,其中一根绳子由几点线性连接而成。可以在空间中的任意位置初始化点,但第一个点是A的初始位置,最后一个点是A的最终位置

最初,绳索将是一条非常糟糕的路线。要进行优化,请沿能量渐变移动点。在你的例子中,能量函数非常简单,即绳子的总长度

这不是一个新的想法,但在计算机视觉中用于检测物体的边界,尽管能量函数要复杂得多。然而,看看“蛇”,给你一个想法,如何移动每个点,因为它有两个邻居:)

然而,在您的例子中,简单地从相邻点施加的力导出每个点的方向就可以了

你的问题是一个考虑碰撞的有约束的问题。我真的同意@paddy的想法,在这里使用凸面外壳,甚至每个对象都使用一个球体。在后一种情况下,不要将点移动到其到B的距离小于a半径加上B半径加上一个模糊因子的位置,因为你没有无限多的点


有效的解决方案要求任何邻居之间的最长距离小于阈值,否则,两点之间的连接线将与障碍物相交。

您所问的实际上是一个寻路问题;更具体地说,这是“任何角度的寻路问题。”

如果可以将障碍物的边缘限制在栅格上,那么一个流行的解决方案是只在该栅格上使用*,然后应用路径平滑。然而,有一种(相当新的)算法,它比路径平滑更易于实现/理解,并提供更好的结果。它叫

有一篇很好的文章解释了Theta*(我从中窃取了上面的图片)


如果无法将障碍物限制在栅格中,则必须为地图生成一个:

有很多方法可以做到这一点,其复杂性各不相同;例如,请参见,或。一个快速的谷歌搜索也会找到很多可以为你做这件事的库,比如or。

我制作这个图像是为了告诉你我到达物体B点的想法。 图像中的对象:- 深蓝色圆点表示对象。红线是障碍。灰点和灰线是可以到达的区域。紫色箭头是点B的方向。对象的灰色线是可视范围。 了解图像:-
该对象将具有一定的可见性。这是一个二维场景,所以我假设视野为180度。(关于人类视野,请参考)物体将使用声纳的概念测量距离。在声纳的帮助下,物体可以找到它能到达的区域。使用回溯,对象可以找到到对象的路径。如果无路可走,则对象必须更改其可见性范围

将此视为阴影投射问题的一种方法。将
A
设置为“光源”,然后确定场景中的每个点是否处于阴影中。不在阴影中的可以通过
A
中的光线访问。其他领域则不然。如果您发现
B
处于阴影中,则只需在灯光下的场景中找到最近的点

如果将这个问题离散化为“像素”,那么上述方法在大量有关阴影渲染的计算机图形学文献中都有非常著名的解决方案。例如,您可以使用来使用布尔标志绘制每个像素,该标志指示像素是否处于阴影中。查找最近的照明像素只需简单地搜索
B
周围不断增长的同心圆。这两种操作都可以通过利用GPU硬件实现极快的速度


另一个注意事项:可以将一般对象路径查找问题视为点路径问题。秘密在于利用闵可夫斯基差异将障碍物“增长”到适当的数量。请参见示例。

要避免的是一个对象还是任意数量的对象?它是在平面空间还是三维空间?障碍物在途中会移动吗?衡量逃生选择成功与否的标准是什么?是要避免的一个目标还是任意数量的目标?是-10 k的物体,三维空间,障碍物在行进中会移动吗?不,什么是衡量逃跑成功的标准?在给定的步距内,光线投射不得与任何障碍物碰撞。是绳索吗