最简理解空间射线与平面交点

工作时正好碰到了这个老生常谈的问题,但百度出来都看起来复杂,不易于理解。
其实是很简单的问题,这里重新推导,并记录一下公式。

核心:

几何意义,使用dot,避免空间平面,直线方程。

已知:

平面一点c,平面法线N,射线起点o,射线方向dir。

推导:

设交点为o+k*dir
因为法线与平面上向量垂直
N·(o+k*dir-c)=0
为简化记T=o-c
则k=-(T·N)/(dir·N)

这里还有个除0问题。也就是射线方向完全与法线平行:要么射线本身就在平面上,我们认为相交距离为0;不在平面上,就认为是负无穷(我用正负判定是否相交)

代码:

//https://blog.csdn.net/qq_41524721/article/details/103490144
float RayCastPlane(float3 rayPos, float3 rayDir, float3 planeP, float3 planeN)
{
	float dd = dot(rayDir, planeN);
	if (NearZero(dd))
	{//dir is perpendicular to normal
		if (NearZero(dot(rayPos - planeP, planeN)))
		{//rayPos is in plane,consider ray dis is 0
			return 0;
		}
		else
		{//not cast,infinite intersection
			return -12345;//当作负无穷
		}
	}
    return -dot(rayPos - planeP, planeN) / dd;
}

你可能感兴趣的:(数学,平面,几何学)