参考
https://blog.csdn.net/abcjennifer/article/details/6688080
public static class MyUtils
{
/*
* 求一条直线与平面的交点
* [param] planeVector, 平面的法线向量.
* [param] planePoint, 平面经过的一点坐标.
* [param] lineVector, 直线的方向向量.
* [param] linePoint, 直线经过的一点坐标.
* [returns] 是否想交, rtn 是交点坐标.
*/
public static bool PlaneLineIntersectPoint(ref Vector3 planeVector, ref Vector3 planePoint, ref Vector3 lineVector, ref Vector3 linePoint, out Vector3 rtn)
{
float vp1, vp2, vp3, n1, n2, n3, v1, v2, v3, m1, m2, m3, t, vpt;
vp1 = planeVector.x;
vp2 = planeVector.y;
vp3 = planeVector.z;
n1 = planePoint.x;
n2 = planePoint.y;
n3 = planePoint.z;
v1 = lineVector.x;
v2 = lineVector.y;
v3 = lineVector.z;
m1 = linePoint.x;
m2 = linePoint.y;
m3 = linePoint.z;
vpt = v1 * vp1 + v2 * vp2 + v3 * vp3; //点乘
//首先判断直线是否与平面平行(正确的浮点判断0方式)
if (Math.Abs(vpt) <= 0.000001f)
{
rtn.x = rtn.y = rtn.z = 0;
return false;
}
t = ((n1 - m1) * vp1 + (n2 - m2) * vp2 + (n3 - m3) * vp3) / vpt;
rtn.x = m1 + v1 * t;
rtn.y = m2 + v2 * t;
rtn.z = m3 + v3 * t;
return true;
}
}