代码为C#版本(其中的直线使用了Ray射线类来代替),在Unity中测试通过。
参考如下:
//返回第一条射线上的点。
Vector3 GetLineMinDistPoint1(Ray ray1, Ray ray2)
{
Vector3 p1 = ray1.origin;
Vector3 p2 = ray2.origin;
Vector3 d1 = ray1.direction;
Vector3 d2 = ray2.direction;
Vector3 n = Vector3.Cross(d1, d2);
// 方向向量叉乘为零,表示直线平行或重合
if (Mathf.Approximately(n.magnitude, 0))
{
// 平行或重合的情况
return p1;
}
else
{
// 不平行的情况
Vector3 cross1 = Vector3.Cross(d1, d2);
return GetLinePlaneIntersectPoint(p1, d1, p2, Vector3.Cross(d2, cross1).normalized);
}
}
//输出两条射线上的两个点,返回值为true是平行,false为不平行
bool GetLineMinDistPoints(Ray ray1, Ray ray2, out Vector3 point1, out Vector3 point2)
{
Vector3 p1 = ray1.origin;
Vector3 p2 = ray2.origin;
Vector3 d1 = ray1.direction;
Vector3 d2 = ray2.direction;
Vector3 n = Vector3.Cross(d1, d2);
// 方向向量叉乘为零,表示直线平行或重合
if (Mathf.Approximately(n.magnitude, 0))
{
// 平行或重合的情况
point1 = p1;
point2 = p2;
return true;
}
else
{
// 不平行的情况
Vector3 cross = Vector3.Cross(d1, d2);
point1 = GetLinePlaneIntersectPoint(p1, d1, p2, Vector3.Cross(d2, cross).normalized);
point2 = GetLinePlaneIntersectPoint(p2, d2, p1, Vector3.Cross(d1, cross).normalized);
return false;
}
}
//线和平面的交点
Vector3 GetLinePlaneIntersectPoint(Vector3 rayPoint, Vector3 rayDirection, Vector3 planePoint, Vector3 planeNormal)
{
float d = Vector3.Dot(planePoint - rayPoint, planeNormal) / Vector3.Dot(rayDirection, planeNormal);
return d * rayDirection + rayPoint;
}