【问题标题】:Flocking/ Boids Algorithm : Field Of view specified by angle in 3D植绒/ Boids算法:由3D角度指定的视野
【发布时间】:2020-12-12 13:26:18
【问题描述】:

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

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

360 度很容易 - U 只检查两个 boid 之间的距离。但我不希望 boids 能够看到自己的身后。我也希望能够在Inspector中改变视角,所以必须基于计算。

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

我已经尝试过使用锥形网格对撞机,但效果不佳。 - 不适用于 180 及更高版本。所以我正在寻找计算这个的最佳方法。

【问题讨论】:

    标签: algorithm math artificial-intelligence simulation angle


    【解决方案1】:

    假设 boid 在点 p = (p.x, p.y, p.z) 朝向某个点 h = (h.x, h.y, h.z),我们想知道点 q = (q.x, q.y, q.z) 的对象是否在 boid 的视野中。

    余弦定律为我们提供了 boid 的航向与 boid 到对象的路径之间的夹角 φ 的余弦公式:

              (h−p) · (q−p)
    cos(φ) = ---------------
             ||h−p|| ||q−p||
    
           = (dx1*dx2 + dy1*dy2 + dz1*dz2) /
             (sqrt(dx1*dx1 + dy1*dy1 + dz1*dz1) * sqrt(dx2*dx2 + dy2*dy2 + dz2*dz2))
    

    在哪里

    dx1 = h.x - p.x
    dy1 = h.y - p.y
    dz1 = h.z - p.z
    dx2 = q.x - p.x
    dy2 = q.y - p.y
    dz2 = q.z - p.z
    

    给定某个角度 ρ(以您的余弦函数接受的任何单位,通常是弧度),而 boid 无法看到(将视野放在 ),我们有

    φ > ρ  if and only if  cos(φ) < cos(ρ),
    

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

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

    【讨论】:

    • 您好,非常感谢您的回答。但是我真的不明白你是怎么得到那个公式的?我相信余弦定律代表另一个方程
    • 非常感谢!
    • @Zearin 将您命名为 relTheta 的变量设置为 cos theta,因此下面的 p.cos(relTheta) 应该只是 relTheta(可能应该命名为 cosRelTheta 以避免混淆) .此外,如果您指的是传统意义上的速度,p5.Vector.sub(this.velocity, this.position) 看起来很可疑。这个答案中的h 是一个目的地点,如果它朝那里去,h-p 应该与 boid 的速度方向相同。
    • @Zearin 不,您不应该在商上调用 cos。正确的定义是const cosRelTheta = numerator / denominator
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2015-07-12
    • 2011-09-06
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多