在 3D 中两条射线的相交性检测
令 3D 中两条以参数形式定义的射线:
⎩⎨⎧r1(t1)=p1+t1d1r2(t2)=p2+t2d2
暂时不考虑 t1 , t2 的取值范围,即考虑的是无限长的射线;
并且其中向量 d1 , d2 不必是单位向量。
若这两条射线在一个平面中,则跟 2D 中的直线相交的情况相同:
- 两条射线交于一点;
- 两条射线平行,没有交点;
- 两条射线重合,有无限多交点。
在三维空间中,存在第四种可能性:
推导过程:
r1(t1)p1+t1d1t1d1(t1d1)×d2t1(d1×d2)t1(d1×d2)t1(d1×d2)t1(d1×d2)⋅(d1×d2)=r2(t2)=p2+t2d2=p2+t2d2−p1=(p2+t2d2−p1)×d2=(t2d2)×d2+(p2−p1)×d2=t2⋅0+(p2−p1)×d2=(p2−p1)×d2=((p2−p1)×d2)⋅(d1×d2)
可得:
t1=∥d1×d2∥2((p2−p1)×d2)⋅(d1×d2)
同理:
t2=∥d1×d2∥2((p2−p1)×d1)⋅(d1×d2)
NOTE :
- d1×d2=0 :两条射线平行或者重合,即上式的分母为零。
- 若两条射线在一个平面内,那么 r1(t1) 和 r2(t2) 是相距最近的点。
- 通过检查 r1(t1) 和 r2(t2) 间的距离即可确定两条射线相交的情况。
- 当其两点重合时便代表相交。
- 由于浮点数的精度问题,实际中往往需要用一个偏差值。
- 上面的讨论假设没有限定 t1 , t2 的取值范围,如果射线的长度有限(或者只沿一个方向延伸),在计算出 t1 , t2 后还应作适当的边界检测。