当平面上取不相等的任意两个点组成一个向量,与平面的法线总是垂直的,向量垂直点乘为0,因此可以通过一个点和一个法线来定义,plane方程如下:(P - P0)·N = 0
N=normal,P0表示平面上的一个点,P表示平面上的任意点,当P = P0时 0·N = 0
射线方程在上一次写过,联立两个方程式可求交点。方程如下:
( O + D·t - P0 )·N = 0
=> ( O - P0 )·N + D·N·t = 0
=> t = ( P0 - O)·N / D·N ( 其中D·N ≠0 )
注意两点
- 当
D·N = 0
时,表示射线与平面垂直,则射线与平面平行。
- 解出 t < 0 时,表示 射线沿着平面相反的半平面发射,也是不相交的(当然如果是直线就没关系啦)
代码很容易翻译,如下:
bool Intersect(const Ray& ray, const Plane& plane, float& t0)
{
Vector3 p0o = plane.GetPosition() - ray.GetOrigin();
float dotDN= dot(ray.GetDirection(), plane.GetNormal());
//平行
//绝对值表明从两面交平面都是成立的
if (fabs(dotDN) < FLOAT_EPISLON)
{
return false;
}
t0 = dot(p0o, plane.GetNormal()) / determin;
return t0 > 0;
}