You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查两球面上两点的连线是否不与任一球体相交

线段与球体碰撞检测方法(无需基变换)

你不需要用基变换矩阵,直接在全局坐标系下计算即可,步骤如下:

核心思路

因为p1在球1表面、p2在球2表面,我们只需要检查线段中间部分是否进入任一球体的内部(排除端点,因为端点本身就在球面上)。


针对单个球体的检测步骤

假设要检测的球体参数为:中心C,半径R;检测线段为p1 -> p2。

  1. 计算向量:

    • 线段方向向量:vec_ab = p2 - p1
    • 球心到线段起点的向量:vec_ac = C - p1
  2. 计算线段上离球心最近点的参数t:

    dot_ab_ab = vec_ab · vec_ab  # 向量vec_ab的点积,即长度平方
    if dot_ab_ab == 0:
        # 线段长度为0,两点重合,直接跳过(不会穿过球体)
        continue
    t = (vec_ac · vec_ab) / dot_ab_ab
    
  3. 筛选有效的t范围:

    • 检测球1时:t必须在(0, 1)之间(因为t=0对应p1,本身在球1表面,不算穿过)
    • 检测球2时:t必须在(0, 1)之间(因为t=1对应p2,本身在球2表面,不算穿过)
  4. 计算最近点并判断是否穿球:
    如果t在有效范围内:

    • 计算最近点:closest_point = p1 + t * vec_ab
    • 计算最近点到球心的距离平方:dist_sq = |closest_point - C|²
    • 如果dist_sq < R²,说明线段穿过了该球体内部,不符合要求。

完整检测流程

  • 对球1执行上述检测,若穿过则连线无效
  • 对球2执行上述检测,若穿过则连线无效
  • 两个检测都通过,说明连线符合要求

内容的提问来源于stack exchange,提问作者Lightsong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:54:20