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 {
}
} 二球心距离大于两半径之和就不会碰撞。碰撞检测。 做过空间多粒子布朗运动的模拟,做凸多面体的碰撞检测用到闵可夫斯基和。 这个问题能解决讨论的人不会很多,有门槛的。 在自动泊车系统里这是关键算法
页:
[1]