mayaxu 发表于 2021-11-9 20:35:14

ORCA避障算法中,判断小球是否会碰撞的疑惑

算法的背景是,球A B在平面上运动,已知A B当前速度与位置。如何判断检测时间T后,两球是否碰撞

网上有文章介绍改算法。下面是摘抄的截图
原文在:https://stackoverflow.com/questions/68107545/finding-the-shortest-vector-from-a-point-to-a-truncated-cone-in-3d
参考:https://zhuanlan.zhihu.com/p/74888471





其中有段算法 不太明白,期望大神解惑
    const Vector3 relativePosition = other->position_ - position_;                        //相对位置
    const Vector3 relativeVelocity = velocity_ - other->velocity_;                        //相对速度
    const float distSq = absSq(relativePosition);                                                //相对距离的平方
    const float combinedRadius = radius_ + other->radius_;                                //合并半径
    const float combinedRadiusSq = sqr(combinedRadius);                                //半径平方

    Plane plane;
    Vector3 u;

    if (distSq > combinedRadiusSq) {
      /* No collision. */
      const Vector3 w = relativeVelocity - tau * relativePosition;
      /* Vector from cutoff center to relative velocity. */
      const float wLengthSq = absSq(w);

      const float dotProduct = w * relativePosition;

      if (dotProduct < 0.0f && sqr(dotProduct) > combinedRadiusSq * wLengthSq) {        // 第二个条件不明白   文章有解释:dotProduct = sqrt(wLengthSq) * |P| * cos(psi) and |P| * cos(pi/2 - phi) = combinedRadius then cos(psi)^2 > cos(pi/2 - phi)^2没看懂
            /* Project on cut-off circle. */                                                                               
            const float wLength = std::sqrt(wLengthSq);
            const Vector3 unitW = w / wLength;

            plane.normal = unitW;
            u = (combinedRadius * tau - wLength) * unitW;
      }
      else {
      }
    }

markfang2050 发表于 2021-11-9 22:46:14

二球心距离大于两半径之和就不会碰撞。碰撞检测。

markfang2050 发表于 2021-11-9 22:48:07

做过空间多粒子布朗运动的模拟,做凸多面体的碰撞检测用到闵可夫斯基和。

markfang2050 发表于 2021-11-14 17:27:37

这个问题能解决讨论的人不会很多,有门槛的。

markfang2050 发表于 2021-11-14 17:28:21

在自动泊车系统里这是关键算法
页: [1]
查看完整版本: ORCA避障算法中,判断小球是否会碰撞的疑惑