GJK算法
Gilbert-Johnson-Keerthi Algorithm
GJK 算法是一种用于凸体之间距离查询和碰撞查询的计算几何算法。它常作为距离检测和碰撞检测的核心组件,用于机器人、图形学和物理仿真中的凸网格、凸包或其他凸几何体。
Convex Distance
给定两个凸体
GJK 把这个问题转化为 Minkowski 差
到原点的距离:
若原点落在
Support Mapping
GJK 不需要显式构造完整的 Minkowski 差,而是反复调用支持点函数。对方向
Minkowski 差的支持点可由两个原始支持点组合得到:
算法维护一个由支持点组成的 simplex,并迭代更新最接近原点的 simplex。二维中 simplex 是点、线段或三角形;三维中是点、线段、三角形或四面体。
Use in Robotics
对凸机器人部件和凸障碍,GJK 可直接返回距离或相交判断。复杂形状通常先分解成凸体并取所有凸体对的最小距离:
其中
这样非凸机械臂、环境网格和工具模型可以通过凸分解接入同一个距离查询框架。
Boundary Conditions
GJK 的基本对象是凸体;非凸形状若不做分解,支持映射不能表达真实最近距离。数值实现还需要容差来区分微小正距离、接触和穿透。若需要穿透深度或接触法向,工程系统常在 GJK 相交后接入额外的接触求解步骤。