平面的法向量N和平面上点P1可以确定一个平面
直线的方向向量N1和直线上一个点P0确定一条直线
已知P0不在平面上,计算直线和平面的交点P2
很容易理解,向量P0P1和向量P0P2在平面法线上的投影长度相等,即Dot(P0P1, N)等于Dot(P0P2, N)
根据相似三角形 Dot(N1, N) / Dot(P0P2, N)==|N1| / Distance(P0,P2)
上代码:
/// <summary>
/// 计算直线和平面的交点
/// </summary>
/// <param name="linePoint">直线上一点,不能在平面上</param>
/// <param name="lineDir">直线的方向向量,不能和平面平行</param>
/// <param name="planePoint">平面上一点</param>
/// <param name="planeNormal">平面的法向量</param>
/// <returns></returns>
public static Vector3 CalcLineAndPlanePoint(Vector3 linePoint, Vector3 lineDir, Vector3 planePoint, Vector3 planeNormal) {
float length = Vector3.Dot(planePoint - linePoint, planeNormal) / Vector3.Dot(lineDir, planeNormal);
return linePoint + length * lineDir;
}