射线与平面相交

当平面上取不相等的任意两个点组成一个向量,与平面的法线总是垂直的,向量垂直点乘为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 )

注意两点

  1. 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;
}

你可能感兴趣的:(射线与平面相交)