Flocking/ Boids 算法:通过 3D 角度指定的视野

sca*_*lot 3 algorithm simulation math artificial-intelligence angle

我正在尝试在 Unity 3D 中制作 boids 算法。

我遇到了一个问题:如何实现特定角度的视野?

360 度很容易 - U 仅检查两个主体之间的距离。但我不希望机器人能够看到自己的身后。我还希望能够在 Inspector 中更改视角,因此它必须基于计算。

如果有任何想法,我将不胜感激:(

在此输入图像描述 在此输入图像描述

我已经尝试过使用圆锥体的网格碰撞器,但效果不佳。- 不适用于 180 及以上。所以我正在寻找计算这个的最佳方法。

Dav*_*tat 5

假设 boid 正在p = (p.x, p.y, p.z)向某个点 前进h = (h.x, h.y, h.z),并且我们想知道该点的物体是否q = (q.x, q.y, q.z)在 boid 的视野中。

\n

余弦定律为我们提供了一个\xcf\x86计算物体航向和物体到达物体的路径之间夹角余弦的公式:

\n
          (h\xe2\x88\x92p) \xc2\xb7 (q\xe2\x88\x92p)\ncos(\xcf\x86) = ---------------\n         ||h\xe2\x88\x92p|| ||q\xe2\x88\x92p||\n\n       = (dx1*dx2 + dy1*dy2 + dz1*dz2) /\n         (sqrt(dx1*dx1 + dy1*dy1 + dz1*dz1) * sqrt(dx2*dx2 + dy2*dy2 + dz2*dz2))\n
Run Code Online (Sandbox Code Playgroud)\n

在哪里

\n
dx1 = h.x - p.x\ndy1 = h.y - p.y\ndz1 = h.z - p.z\ndx2 = q.x - p.x\ndy2 = q.y - p.y\ndz2 = q.z - p.z\n
Run Code Online (Sandbox Code Playgroud)\n

给定一些角度\xcf\x81(无论你的余弦函数接受什么单位,通常是弧度),经过该角度,boid 都看不到(将视野设置为2\xcf\x81),我们有

\n
\xcf\x86 > \xcf\x81  if and only if  cos(\xcf\x86) < cos(\xcf\x81),\n
Run Code Online (Sandbox Code Playgroud)\n

所以我们可以预先计算cos(\xcf\x81),然后使用上面的公式进行重复测试。

\n

为了避免被零除和其他数值问题,您可能需要检查除法的分母是否非常小,如果是,则声明 boid 可以感觉到任何物体,即使是在其视野之外。

\n